2017-03-03 207 views
0

把这个文本文件追加修改:命令注释掉一行文本,并在下一行

# 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)执行此操作?

回答

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 
+0

但是如果组捕获也用于搜索模式,例如, '焦油(GET)+'?我事先并不知道使用了多少这样的组,因为这种模式是从外部提供的。至少有一种方法可以引用最后一个匹配的组? – user7652621

1

试试这个:

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

target发现,h持有线和G追加到模式空间(该行现在复制)。

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