2017-03-03 205 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