Replace 命令注释掉一行文本并在下一行追加修改

Replace 命令注释掉一行文本并在下一行追加修改,replace,sed,command-line,Replace,Sed,Command Line,以这个文本文件为例: # Existing comment #some already_commented_out line some target line 并制作: # Existing comment #some already_commented_out line #some target line some modified line 我可以使用两个单独的sed命令执行此操作: sed -i -r 's/^[^#].*target.*$/#&\n&/' te

以这个文本文件为例:

# Existing comment

#some already_commented_out line

some target line
并制作:

# Existing comment

#some already_commented_out line

#some target line
some modified line
我可以使用两个单独的sed命令执行此操作:

sed -i -r 's/^[^#].*target.*$/#&\n&/' textfile
sed -i -r '/^[^#].*target/{s/target/modified/}' textfile

有没有办法将它们组合成一个命令?是否有更好的方法使用其他sed命令(如append)执行此操作?

在您的简单示例中,可以使用以下sed命令实现:

\1、\2、\3分别是第一个、第二个和第三个捕获组

cat测试文件输出:

试试这个:

sed -i '/\(.*\)target/{h;G;s//#\1 modified/}' textfile
当找到目标时,h保留该行,G将其附加到模式空间。该行现在已复制


s命令用modified.

替换目标的最后一次出现,但是如果在搜索模式中也使用组捕获,例如target+?我事先不知道使用了多少这样的组,因为该模式是由外部提供的。是否有一种方法可以至少参考最后匹配的组?
# Existing comment

#some already_commented_out line

#some target line
some modified line
sed -i '/\(.*\)target/{h;G;s//#\1 modified/}' textfile