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

问题描述 投票:0回答:2

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

我设法获得了行号:

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)。

sed
2个回答
0
投票

这是使用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)]

0
投票

这可能对您有用(GNU sed):

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

从文件开头的注释开始的任何行中删除,在第一行之后添加非注释的多余行,并继续获取/打印文件的所有其余行。

© www.soinside.com 2019 - 2024. All rights reserved.