【问题标题】:sed - remove line break if line does not end on \"sed - 如果行不在 \" 结束,则删除换行符
【发布时间】:2015-10-15 17:11:00
【问题描述】:

我有一个 tsv.-file 并且有些行不以 '"' 结尾。所以现在我想删除不是直接在 '"' 之后的每个换行符。 我怎么能用 sed 做到这一点?或任何其他 bash shell 程序...

亲切的问候, 乱七八糟

【问题讨论】:

    标签: macos sed line-breaks


    【解决方案1】:

    这可能对你有用(GNU sed):

    sed ':a;/"$/!{N;s/\n//;ta}' file
    

    这会检查模式空间的最后一个字符是否为",如果不是,则追加另一行,删除换行符并重复,直到满足条件或遇到文件结尾。

    另一种选择是:

    sed -r ':a;N;s/([^"])\n/\1/;ta;P;D' file
    

    机制留给读者思考。

    【讨论】:

      【解决方案2】:

      为了详细说明@Lev 的答案,sed 的 BSD (OSX) 版本对大括号内的命令语法不太宽容——两个命令都需要分号命令分隔符:

      sed '/"$/!{N;s/\n//;}' file.txt
      

      这里是documentation——摘录:

      在地址或地址范围之后,sed 接受花括号'{...}',因此可以将多个命令应用于该行或与地址范围匹配的行。在命令行上,分号 ';'分隔每条指令,并且必须在右大括号之前。

      【讨论】:

        【解决方案3】:

        试试这个 awk 单行代码:

        awk '{printf "%s%s",$0,(/"$/?"\n":"")}' file
        

        测试

        kent$  cat f
        "foo"
        "bar"
        "a long
        text with
        many many
        lines"
        "lalala"
        
        kent$  awk '{printf "%s%s",$0,(/"$/?"\n":"")}' f
        "foo"
        "bar"
        "a longtext withmany manylines"
        "lalala"
        

        【讨论】:

          【解决方案4】:

          这个sed 命令应该这样做:

          sed '/"$/!{N;s/\n//}' file
          

          它说:在每一行不匹配"$ 做:

          • 读取下一行,将其附加到模式空间;
          • 删除两行之间的换行符。

          例子:

          $  cat file.txt
          "test"
          "qwe
          rty"
          foo
          $  sed '/"$/!{N;s/\n//}' file.txt
          "test"
          "qwerty"
          foo
          

          【讨论】:

          • 我得到:sed: 1: "/"$/!{N;s/\n//}": 替换命令中的错误标志:'}'
          • 我在 Mac 上。如果这是相关的。
          • @SnafuBernd 您在 sed 命令中使用双引号吗?如果是这样,请尝试使用单引号。否则,这是 mac sed 的特性之一
          • @SnafuBernd Mac sed 也必须有一种方法。我相信其他人会知道的。
          • @jspencer 最后一行就是$/slashes/ 中包含的地址由正则表达式匹配。正则表达式是"$,即引号后跟行尾。这与 OP 的“不在" 之后的换行符”的要求相反。
          猜你喜欢
          • 2016-07-13
          • 2012-11-15
          • 1970-01-01
          • 2018-01-21
          • 2018-06-30
          • 1970-01-01
          • 2015-02-15
          • 2012-07-25
          • 1970-01-01
          相关资源
          最近更新 更多