如何在第一个模式匹配之前附加到行尾?

如何在第一个模式匹配之前附加到行尾?

我有一个包含一些随机数据的文件,例如:

number1 number2 number3
&END

我想在包含数字 3 的行末尾添加一个 \,但我无法在该行上匹配模式,因为该数字一直在变化。因此,我尝试在 sed 中匹配“&END”,然后在其前面添加一行,但这对我来说不起作用,因为它会创建一个新行,例如

number1 number2 number3

\

&END

我想要的输出是

number1 number2 number3 \
&END

另外,我只需要在文件中第一次出现 &END 时进行此更改。有没有办法使用 sed 或者 awk 来做到这一点?

编辑:我的输入文件是 test.restart,如下所示:

&COORD

1.4089452021105357E+01  1.3165670625576730E+01  1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01  1.2120902691780184E+01  1.2741652733169291E+01

&END
...
...
&COORD

H 3475843 73457834 7346587435
...
...
&END

我只需要在第一次出现 &END 之前的文本块中进行更改。

答案1

您可以使用sed -z并包含\n在您的模式中:

-z, --null-数据
用 NUL 字符分隔行

sed -Ez 's/(\n+&END)/ \\\1/' file

sed默认情况下,每行仅替换第一次出现的内容。如果使用 NUL 分隔符,则只有一行,所以没问题。

-E告诉sed使用扩展正则表达式 (ERE) 而不是基本正则表达式 (BRE)。您可以省略该标志,但随后需要转义括号:

sed -z 's/\(\n+&END\)/ \\\1/' file

输出:

&COORD

1.4089452021105357E+01  1.3165670625576730E+01  1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01  1.2120902691780184E+01  1.2741652733169291E+01 \

&END
...
...
&COORD

H 3475843 73457834 7346587435
...
...
&END

请注意,-z在 Ubuntu 中可以使用,但并非在所有sed实现中都可用,因此不是可移植的解决方案。

相关内容