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

1つのコマンドにそれらを組み合わせる方法はありますか?他の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

しかし、グループキャプチャが検索パターンでも使用されるとどうなりますか? 'tar(get)+'?パターンが外部から供給されているので、そのようなグループがいくつ使用されているのかは事前にわかりません。最後にマッチしたグループを少なくとも参照する方法はありますか? – user7652621

1

これを試してみてください:

targetが発見された
sed -i '/\(.*\)target/{h;G;s//#\1 modified/}' textfile 

hはラインを保持し、Gは(ラインが今二重化されている)パターンスペースに追加します。

sコマンドは、最後に発生したtargetmodifiedに置き換えます。

関連する問題