【问题标题】:sed substitution using ampersand (&)使用与号 (&) 进行 sed 替换
【发布时间】:2011-03-16 09:40:35
【问题描述】:

我搜索了高低,希望你能帮助我。我需要在文件中找到不以双引号 (") 开头的每一行,并将该行附加到上一行。

我已经使用以下命令成功地做到了这一点:

cat 文件名.csv | sed -e :a -e '$!Ns/\n[^"]//;ta -e 'P;D' > newfilename.csv

我的问题是替换。正如您所期望的那样,在该行附加到上一行之后,第一个字符被删除。我需要它不要被删除。我试过了 猫文件名.csv | sed -e :a -e '$!Ns/\n[^"]/&/;ta -e 'P;D' > newfilename.csv

但它只是挂起。我认为与号 (&) 会复制匹配的行。

输入:

"line 1
<line 2>

现有或第一个 sed 命令的输出是: lineline2&gt; ** 注意删除了

我需要输出为line1&lt;line2&gt;

非常感谢您提供的任何帮助!

【问题讨论】:

    标签: sed append substitution


    【解决方案1】:

    我似乎无法让你原来的命令工作。您是否在某处遗漏了单引号?

    假设原始命令有效并且我记得 sed 的工作原理,我将只使用反向引用,如下所示:

    sed -e :a -e '$!Ns/\n([^"])/\1/;ta -e 'P;D'

    (添加括号并将 & 替换为 \1)

    【讨论】:

      【解决方案2】:

      您缺少结束单引号,因此 shell 将 & 符号解释为对操作进行后台处理的请求。试试:

      sed -e ':a' -e '$!Ns/\n\([^"]\)/\1/;ta' -e 'P;D' filname.csv > newfilename.csv
      

      你不能使用 & 符号,因为这样会保留换行符。

      【讨论】:

        【解决方案3】:

        你也可以用 awk 来做:

        awk '{if (NR>1 && $1 ~ "^\"") print "" ; printf $0 } END {print ""}' filname.csv > newfilename.csv
        

        【讨论】:

          【解决方案4】:
          $ cat file
          "line 1
          <line 2>
          "line 3
          <line 4>
          
          $ awk 'ORS=/^\042/?" ":"\n"' file
          "line 1 <line 2>
          "line 3 <line 4>
          

          或者如果你可以使用 Ruby(1.9+)

          $ ruby -ne 'print /^"/? $_.chomp: $_' file
          "line 1<line 2>
          "line 3<line 4>
          

          【讨论】:

            猜你喜欢
            • 2013-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-25
            • 1970-01-01
            • 2020-05-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多