我有一个包含15列的源文件,有些列在数据中有一个新行字符,我需要删除它们,同时保留记录分隔符,这也恰好是新行字符。
已经看到了解决方案
sed -e :a -e '$!N; s/ *\n\([^"]\)/ \1/; ta' -e 'P;D' file
在下面的帖子中
Need to selectively remove newline characters from a file using unix (solaris)
但由于我没有足够的声誉,因此无法评论。
有人可以帮我理解sed命令吗?
由于
答案 0 :(得分:1)
-e
此后的字符串中的动作列表
:a
定义标签(用于转到跳转)
$!N
如果不是最后一行,则将新行加载到工作缓冲区(添加一行以处理下一行动)(如果在最后一行,则跳过并转到下一行)
s/ *\n\([^"]\)/ \1/
替换空格(任意数量)+换行后跟除"
(任意数量)之外的任何内容[保留此内存n°1]按空格+内存内容
ta
如果有替换,请转到标签a
(直到现在重新开始循环)
P
打印当前工作缓冲区的第一行
D
删除第一行并转到操作结束列表(因此将新行加载到缓冲区中,如果不在最后一行则重新启动)
所以这个sed将删除任何处于特定顺序的新行(事实上,如果在序列中使用*,它将删除文件的任何新行,后跟不是"
的内容当然你的字段内容结束分隔符
答案 1 :(得分:0)
另一篇文章(为清楚起见,另一篇是对你的sed的解释)
sed -e ':a
s/\([^,]*,\)\{14\}\(.*\)/&/
t rmNL
N
b a
: rmNL
s/\n//g' YourFile
尝试这个但是,第15个字段中可能没有新行(因为无法知道它是否是此新记录第一行的归档或真实新记录或内容的一部分)
加载新行,直到,
分隔15个内容,然后删除内部的任何NewLine