2016-10-05 5 views
2

gawkを使用してパターンを含む行を一連の行に置き換えようとしています。私があれば、gawkは、パターンを含む行を変数を使用して複数の行に置き換えるために使用します。

aaaa 
111 
222 
aaaa 
111 
222 

をしかし:ファイルaaは、私はライン111の\ N222のセットでXYZを含むすべての行を置き換えるためのgawkを使用してい

aaaa 
ccxyzcc 
aaaa 
ddxyzdd 

が含まれている、のは言ってみましょう、私の変更内容が含まれています使用:

gawk -v nm2="111\n222" -v nm1="xyz" '{ if (/nm1/) print nm2;else print $0}' "aa" 

変更されたコンテンツが表示さ:

aaaa 
ccxyzcc 
aaaa 
ddxyzdd 

xyzを含む行全体が必要です。つまり、ccxyzccddxyzdd111に置き換え、次に222と置き換える必要があります。助けてください。

+1

。そのため、変数 'nm1'の内容と一致するように' $ 0〜nm1'と言う必要があります。 – fedorqui

答えて

3

あなたのコードの問題は、おかげで提案のため@fedorquiパターンではないnm1変数

$ gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{print nm2; next} 1' aa 
aaaa 
111 
222 
aaaa 
111 
222 

の値としてnm1と一致するように、/nm1/試みは、nextは単純にマッチング入力行の内容を上書きすることによって回避することができましたGNUと必要なテキスト

gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{$0=nm2} 1' aa 


ソリューションとパターンsed

$ nm1='xyz' 
$ nm2='111\n222' 
$ sed "/$nm1/c $nm2" aa 
aaaa 
111 
222 
aaaa 
111 
222 

cコマンドラインマッチングパターンを削除し、awk's~演算子を使用する場合

+1

ニース!また、 '$ 0〜nm1 {$ 0 = nm2} 1'と言うと、' next'は不要です。 – fedorqui

+2

さらに、三項演算子でもう少しゴルフをしてコードを書く: 'gawk -v nm2 =" 111 \ n222 "-v nm1 =" xyz "'{print $ 0〜nm1? nm2:$ 0} 'ファイル'。 – fedorqui

1

を指定されたテキストを追加し、あなたは右側のリテラル正規表現を提供する必要はありませんでしょう。不適切な構文の修正となり、何かのような

あなたのコマンド、出力を生成し

gawk -v nm2="111\n222" -v nm1="xyz" '{ if ($0 ~ nm1) print nm2;else print $0}' input-file 

aaaa 
111 
222 
aaaa 
111 
222 
1

は、これは私がそれを行うだろうかです:AWKのパターンとして、変数を渡す

$ cat aa 
aaaa 
ccxyzcc 
aaaa 
ddxyzdd 
$ awk '{gsub(/.*xyz.*/, "111\n222")}1' aa 
aaaa 
111 
222 
aaaa 
111 
222 
$ 
0

は常に少しトリッキーです。

awk -v nm2='111\n222' '{if ($1 ~ /xyz/){ print nm2 } else {print}}' 

出力が表示されますが、 'xyz'パターンが修正されました。シェル変数として

渡すNM1も動作します: `/ NM1 /`リテラル文字列に一致するようにしようとしている "NM1" と

nm1=xyz 
awk -v nm2='111\n222' '{if ($1 ~ /'$nm1'/){ print nm2 } else {print}}' aa 
関連する問題