sed不会取代所有的比赛

时间:2017-11-24 14:10:59

标签: regex bash sed

我有一个文件:

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] +线跳一次更换。

1 个答案:

答案 0 :(得分:2)

sed这不是一个很好的工具,因为它是一个基于行的文本编辑工具。

您必须使用N来消耗额外的一行,以便您的工作缓冲区包含分隔两行的换行符;问题是,这只能让你每次都能处理一半的换行,因为一旦N占用了这条线,它就不会被sed的下一次传递消耗掉:你的第一次传递替换了line1\nline2之间的换行符,然后第二次传递了line3\nline4之间的换行符。

sed的一个可能解决方案是在替换前使用内存中的整个文件,如this answer所示:

sed -i ':a;N;$!ba;s/\[A\]\n/, /g' file