我有一个包含一些随机数据的文件,例如:
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
实现中都可用,因此不是可移植的解决方案。