我有一个文件:
Structural Attributes: text
text_id [A]
text_lleng_tr [A]
text_lleng_or [A]
text_cpr [A]
text_for [A]
text_ftr [A]
text_indexador [A]
text_dif [A]
text_reg [A]
text_esp [A]
text_tem [A]
text_tipus [A]
text_data_or [A]
text_data_tr [A]
text_autor [A]
text_traductor [A]
text_titol_or [A]
text_titol_tr [A]
s
s_id [A]
enty
contrac
contrac_forma [A]
abr
date
p
然后我在它上面运行这个sed命令:
sed -i "N;s/\[A\]\n/,/g" file
我从中得到:
Structural Attributes: text
text_id , text_lleng_tr [A]
text_lleng_or , text_cpr [A]
text_for , text_ftr [A]
text_indexador , text_dif [A]
text_reg , text_esp [A]
text_tem , text_tipus [A]
text_data_or , text_data_tr [A]
text_autor , text_traductor [A]
text_titol_or , text_titol_tr [A]
s
s_id [A]
enty
contrac
contrac_forma , abr
date
p
所以,你可以看到仍然有[A] +行跳转,如果我在同一个文件上第二次运行sed命令,[A] +行跳跃的数量会减少,但我必须运行命令3次[A] +线跳转消失。所以问题是,我做错了什么,或者正确的方法是什么才能让[A] +线跳一次更换。
答案 0 :(得分:2)
sed
这不是一个很好的工具,因为它是一个基于行的文本编辑工具。
您必须使用N
来消耗额外的一行,以便您的工作缓冲区包含分隔两行的换行符;问题是,这只能让你每次都能处理一半的换行,因为一旦N
占用了这条线,它就不会被sed
的下一次传递消耗掉:你的第一次传递替换了line1\nline2
之间的换行符,然后第二次传递了line3\nline4
之间的换行符。
sed
的一个可能解决方案是在替换前使用内存中的整个文件,如this answer所示:
sed -i ':a;N;$!ba;s/\[A\]\n/, /g' file