用&符号替换sed(&)

时间:2011-03-15 16:39:23

标签: sed append substitution

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

我使用以下命令成功完成此操作:

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

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

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

输入:

"line 1
<line 2>

使用现有或第一个sed命令输出: lineline2> * *请注意删除&lt;

我需要输出为line1<line2>

您可以提供任何帮助,我们将非常感激!!

4 个答案:

答案 0 :(得分:0)

我似乎无法让你的原始命令工作。你在某个地方遗漏了单引号吗?

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

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

(添加括号并替换&amp; with \ 1)

答案 1 :(得分:0)

您错过了结束单引号,因此shell将&符号解释为后台操作的请求。尝试:

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

无论如何你都不能使用&符号,因为这会保留换行符。

答案 2 :(得分:0)

您也可以使用awk:

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

答案 3 :(得分:0)

$ 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>