2017-12-29 57 views
1

"from" - "to"指定されたファイルからの文字列を含むファイル内の文字列を置き換えるのに助けが必要です。ファイルの文字列をファイルから置き換えます

fromto.txt:

"TRAVEL","TRAVEL_CHANNEL" 
"TRAVEL HD","TRAVEL_HD_CHANNEL" 
"FROM","TO" 

最初の列が二列に置き換えることがある、のために私に何を探しています。

は、これまでのところ、私はこの小さなスクリプトを書いた:

while read p; do 
    var1=`echo "$p" | awk -F',' '{print $1}'` 

    var2=`echo "$p" | awk -F',' '{print $2}'` 
    echo "$var1" "AND" "$var2" 

    sed -i -e 's/$var1/$var2/g' test.txt 
done <fromto.txt 

出力は(XとY)良いように見えますが、何らかの理由では、第2($ var2の)で、最初の列($ VAR1)に代わるものではありません。 。

あるtest.txt:

"TRAVEL" 

出力:あなたは以下のsedのような

多分何かスクリプト内の変数を使用する必要があり、このワンショットを行うことはできません

"TRAVEL" AND "TRAVEL_CHANNEL" 
sed -i -e 's/"TRAVEL"/"TRAVEL_CHANNEL"/g' test.txt 
"TRAVEL HD" AND "TRAVEL_HD_CHANNEL" 
sed -i -e 's/"TRAVEL HD"/"TRAVEL_HD_CHANNEL"/g' test.txt 
"FROM" AND "TO" 
sed -i -e 's/"FROM"/"TO"/g' test.txt 

$ cat test.txt 
"TRAVEL" 
+1

'sed -i'はインプレースのファイルで動作します。今すぐ 'sed'のコマンドを理解する必要があります:) – bedwyr

+0

はい、各行の前にsedコマンドを追加できますが、実際の" fromto.txt "はかなり大きいです。どういうわけか、これらの変数/引数をファイルから読み込むことは可能ですか? – Adrian

+0

これは有用な説明です。説明からすぐには分かりません。したがって、単純なレシピ(これはシェルプロンプトから行うことができます):1.ファイル内の各行について。 2. '' 'の間で値を抽出する; 3. 'sed'コマンドでそれらの値を置換のために使う(例えば' sed -i' s/$ val1/$ val2/g ')。 – bedwyr

答えて

0

完全交換用コマンド

-bash-4.4$ cat > toto.txt 
1 
2 
3 
-bash-4.4$ cat > titi.txt 
a 
b 
c 
-bash-4.4$ sed 's|^\s*\(\S*\)\s*\(.*\)$|/^\2\\>/s//\1/|' toto.txt | sed -f - titi.txt > toto.txt 
-bash-4.4$ cat toto.txt 
a 
b 
c 
-bash-4.4$ 
1

入力:

➜ cat fromto 
TRAVEL TRAVEL_CHANNEL 
TRAVELHD TRAVEL_HD 
➜ cat inputFile 
TRAVEL 
TRAVELHD 

作品:

➜ awk 'BEGIN{while(getline < "fromto") {from[$1] = $2}} {for (key in from) {gsub(key,from[key])} print}' inputFile > output 

と出力:

➜ cat output 
TRAVEL_CHANNEL 
TRAVEL_CHANNEL_HD 
➜ 

連想配列にあなたの入力ファイルをロードします(BEGIN{})この最初:、from["TRAVEL"] = "TRAVEL_HD"その後、入力fの各配列要素に対して、検索を非効率的に実行し、行単位で置換する結果を出力して、別の出力ファイルにパイプしました。

検索と置換が互いに干渉する可能性があることに注意してください.2番目の出力行は最初の置換が行われて以来完璧な例です。置き換えを別々に注文したり、gsubの代わりに正規表現を使用したりすることができます。 awk配列が特定の順序を持​​つことが保証されているかどうかはわかりません。とにかく、あなたを始めるための何か。

2番目の警告。あなたのBEGINの第2ステップとして、ファイル全体のgsubを実行する方法があります。おそらくこれをもっと速くすることができますが、私はそれが何であるか分かりません。

+1

素晴らしいライナーですが、fromtoのフォーマットは多かれ少なかれ固定されています。空白文字列のために引用符が使用されます(例: "DISCOVERY CHANNEL")。 – Adrian

+1

@Adrian - ああ、私はそれが 'patsplit()'などでここで解決できると思う:https://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Content私たちはone-liners(そしてawkの私のスキル)に合理的な限界に近づいています。 – zzxyz

関連する問題