使用符号(&;)的sed替换

使用符号(&;)的sed替换,sed,append,substitution,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.cs

我到处寻找,希望你能帮助我。我需要找到文件中不以双引号(“)开头的每一行,并将该行追加到前一行

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

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>
“第1行
现有或第一个sed命令的输出为:
line2>
**注意删除了我似乎无法使您原来的命令正常工作。你有没有遗漏一句话

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

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


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

您缺少结束单引号,因此shell将符号and解释为操作背景请求。请尝试:

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

无论如何,您不能使用符号AND,因为这样可以保留换行符。

您也可以使用awk:

awk '{if (NR>1 && $1 ~ "^\"") print "" ; printf $0 } END {print ""}' filname.csv > newfilename.csv
$cat文件
“第1行
“第3行
$awk'ORS=/^\042/?“”:“\n”文件
“第1行
“第3行
或者如果您可以使用Ruby(1.9+)

$ruby-ne'打印/^”/?$\。chomp:$\ux文件
“第1行
“第3行
$ cat file
"line 1
<line 2>
"line 3
<line 4>

$ awk 'ORS=/^\042/?" ":"\n"' file
"line 1 <line 2>
"line 3 <line 4>
$ ruby -ne 'print /^"/? $_.chomp: $_' file
"line 1<line 2>
"line 3<line 4>