2011-08-08 4 views
0

これは私を狂ってしまいます。bash:2つの行のフィールドの内容が同じであれば、1つのフィールドだけを置換する方法

私はコロンを4つのフィールドファイルに分けました。最後のフィールドを変数に置き換えようとしています。問題は、2つの行が同じ内容の場合、両方が変更されることです。どのラインを変更したいのかをsedに伝えればいいと思っていました。別の言葉で、最初のフィールドは、R2は、その最後のフィールド

ファイル置き換えの場合:私は、それはここでは、この

R1:name1:date1:black 
R2:name2:date2:black2 

のようになりたい

R1:name1:date1:black 
R2:name2:date2:black 

を私がこれまで持っているものである

変数にはすでに4番目のフィールドが割り当てられています。名前には、ユーザが名前を入力するためのゼニティテキストボックスが割り当てられています。

variable=$(awk -F ":" '$2 ~ /'"$name"'/ {print $4}' file) 

sed -i 's/'$variable'/black2/g' file 

ありがとうございます。

sed -i '/^R2/s/:black$/:black2/' file 

お知らせ行の先頭のため^、そして$はラインに黒のどこかに置き換えることを避けるために:行はsedをあなたが制限することができ

+0

なぜべきそれは両方の行を変更しない? –

+0

sedに '/ g'(グローバル置換)があります。 sedが見つけたすべての値を置き換えます。さて、 'g'がなければ、最初の試合だけが置き換えられます。それは大丈夫ですか? –

+0

と同じではないと思われるためです。 – scott

答えて

2

を持つへの置換を適用します。

編集:1行に1回の置換が必要なため、ged引き数をsedに削除しました。 g引数は、行全体に適用されるものではなく、行に適用されます。

+0

これはそれです。完璧に動作します、ありがとう – scott

+0

'sed -i '/^R2/s /:black $ /&2 /' file'もあなたのために働くかもしれません。 – potong

2

またはawkを用いて溶液が、sedのような場所にファイルを変更することが可能であるなしで、そのMVが必要とされている:

awk -F ":" '($1 == "R2" && $4 == "black"){print $1 ":" $2 ":" $3 ":black2"} ($1 != "R2" || $4 != "black"){print $1 ":" $2 ":" $3 ":" $4}' file > file1 
mv file1 file 

または多分短い:

awk -F ":" '{print $1 ":" $2 ":" $3 ($1 == "R2" && $4 == "black"? ":black2" : ":" $4)}' file > file1 
mv file1 file 
+0

私もこれらのawkコマンドを研究しましたが、最後のもの(sed)は理解しやすく、従いやすいですが、とにかく2番目と3番目のオプションを提供してくれてありがとう。 – scott

関連する問題