用于注释掉一行文本并在下一行附加修改的命令

时间:2017-03-03 10:38:57

标签: 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&/' textfile
sed -i -r '/^[^#].*target/{s/target/modified/}' textfile

有没有办法将它们组合成一个命令?是否有更好的方法使用其他sed命令(例如追加)?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

找到target后,h保留该行,G将其附加到模式空间(该行现在已重复)。

s命令将target的最后一次出现替换为modified

答案 1 :(得分:0)

在您的简单情况下,可以使用以下sed命令来实现:

sed -i -r 's/^([^#]*)(target)(.*)$/#\1\2\3\n\1modified\3/g' testfile

\1\2\3分别是第一,第二和第三个被捕获的群体

cat testfile输出:

# Existing comment

#some already_commented_out line

#some target line
some modified line