我搜索过高低,希望你能帮助我。我需要找到一个不以双引号(“)开头的文件中的每一行,并将该行附加到上一行。
我使用以下命令成功完成此操作:
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>
您可以提供任何帮助,我们将非常感激!!
答案 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>