sed:使用正则表达式获取行号并在该行插入文本



我想获取未用哈希注释掉的文件的第一行,然后在该行之前在该行之后附加一行文本。

我设法得到了行的编号:

sed -n '/^s*#/!{=;q}' file            // prints 2

以及插入文本(手动指定行(:

sed '2 a extralinecontent' file

我无法让它们作为一个班轮或成批一起工作。

我尝试了命令替换(使用$(command)和反引号(,但我从 bash 中得到一个错误:

sed '$(sed -n '/^s*#/!{=;q}' file) a extralinecontent' file
-bash: !{=: event not found

并且还尝试了许多其他组合,但没有运气。

我在macOS上使用gnu-sed(通过brew(。

这可能对你有用(GNU sed(:

sed -e '/^s*#/b;a extra line content' -e ':a;n;ba' file

从文件开头以注释开头的任何行中解脱出来,在第一行之后附加一行不是注释的额外行,并继续获取/打印文件的所有剩余行。

这是一种无需两次读取文件即可使用GNU sed

的方法
$ cat ip.txt
#comment
foo baz good
123 456 7889
$ sed -e '0,/^s*[^#[:space:]]/ {// a XYZ' -e '}' ip.txt
#comment
foo baz good
XYZ
123 456 7889
  • GNU sed允许0另一个地址是正则表达式,这样即使第一行符合条件,这也将起作用
  • /^s*[^#[:space:]]/由于sed不支持所有格量词,因此需要确保字符类匹配的第一个字符不是#字符或空格字符
  • //是重复上一个正则表达式的便捷快捷方式
  • a XYZ要附加的所需行(请注意,您的问题提到了insert,因此,如果需要,请使用i而不是a(

最新更新