拿这个文本文件:
# 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命令(例如追加)?
答案 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