2011-10-17 11 views
1

zshで関数を書いて、特定の数値を後ほど大きなスクリプトで使用するキーワードに置き換えます。ここで私が持っているものです:スクリプトを見つけて置き換える(難しい問題です...助けが必要です)

function replace_metal() { 
for file in "[email protected]"; do 
    [ -f "$file" ] && mv $file $file.old 

    # replace metal 
    awk '/^28\s/ { gsub(/28\s/, "METAL") }; { print }' $file.old > $file 

    # remove temporary files 
    rm -f $file.old 
done 
} 

私は、コマンドライン上でそれを実行しますが、スクリプトでいる間、それはファイルを解析し、キーワードで番号を交換するために失敗したときに正常に動作awkの部分。なぜ失敗するのか分かりません。

function fix_filename() { 
for file in "[email protected]"; do 
    [ -f "$file" ] && mv $file $file.old 

    # fix filename 
    awk '{ gsub(/myFileName/,FILENAME); print }' $file.old > $file.tmp 

    # clean up filename 
    awk '{ gsub(/.gjf.old/,""); print }' $file.tmp > $file 

    # remove temporary files 
    rm -f $file.old $file.tmp 
done 
} 

私は、コマンドラインでawkがreplace_metal機能では動作しません理由として特に混乱していますが:私はすべての問題なし作品があること似ている機能を書いています。誰かがそれを説明できるなら、私は本当にそれを感謝します。

ここでは、このスクリプトを実行するファイルの一部の例を示します。それらは私が使用する分子幾何学プログラムのデカルト座標です。

6 4.387152 -0.132561 1.145384 
6 4.435130 0.035315 -0.261758 
6 3.241800 0.069735 -1.002575 
7 2.023205 -0.053248 -0.382329 
6 1.948032 -0.217668 0.977856 
6 3.120408 -0.260395 1.759133 
8 0.936529 -0.001059 -1.144164 
28 -0.810634 -0.374713 -0.376819 
7 -1.066408 1.593331 -0.221421 
6 -2.101594 2.162030 0.386527 
6 -3.220999 1.475281 0.925467 
7 -2.581803 -0.796964 0.180331 
6 -3.412540 0.082878 0.747753 
6 -0.299269 -2.264241 -0.449077 
1 5.304344 -0.163663 1.737743 
1 5.382399 0.136858 -0.794636 
1 3.185977 0.187888 -2.085134 
1 0.932373 -0.311671 1.366224 
1 3.017555 -0.393258 2.837678 
1 -2.114644 3.263364 0.463786 
1 -4.007715 2.050042 1.415626 
1 -4.379471 -0.313239 1.099097 
1 -0.572811 -2.828718 0.461055 
1 0.789786 -2.379489 -0.603095 
1 -0.795666 -2.747919 -1.311858 
6 -3.146815 -2.155894 0.046938 
1 -2.990568 -2.540510 -0.972499 
1 -2.672661 -2.865421 0.746200 
1 -4.233217 -2.149944 0.247135 
6 -0.086130 2.536630 -0.792152 
1 0.886270 2.480474 -0.265799 
1 0.102603 2.306402 -1.853394 
1 -0.445050 3.580750 -0.720938 

変更可能なものは、最初の列の項目のみです。他の3つの列の項目は変更しないでください。あなたの助けのための

ありがとう!

答えて

3

"\"文字のエスケープは問題です。 \ s "または" \\\\ s "でもあります。スクリプトを直接実行しないと、" \ "文字は2回評価されます。最初はシェルで、次にawkで評価されます。あまりにも複雑

試してみてください。

sed -i "s/^28 /METAL/" file 

は、あなたが戻ってもう一度に「file.old」とのファイル「ファイル」をコピーする必要はありませんので、-iは、代わりに代替を意味し、sedの ファイルへ"。

Zshのは、文字列をエスケープする組み込み関数があります知って

f="to be escaped" 
print ${(q)f} 

HTHクリス

+0

感謝。私はsedを使用することに決めたばかりで、それは私のために物事をクリアしました。それは、私がawkスクリプトに入れなかったために、物事を混乱させるはずだったエスケープスペースがあることに気付いたときです。私はsedの-iタグについて知らなかったので、とても役に立ちます! (私は独学です) –

+0

zshには、文字列をエスケープする組み込み関数があります。私の編集された答えを見てください。あなたの問題を解決するのに役立ちましたら、答えを受け入れてください。 – Chris

1

あなたが勝つと(そして、あなたがスペースではなくタブがあります知っている)あなたが怒っ地獄ドライブを引用することができない場合は、ちょうどカンニング:

awk '/^28/{ gsub(/^28 /, "METAL ") }; { print }' $file 

を...または他の[[:space:]]の代わり\sを使用し、 GNU awkは\ sを理解していないようです。私にとっては、平野でさえも

[0 1047 19:39:10] ~/temp/stack % gawk '/^28\s/ { gsub(/28\s/, "METAL") }; { print }' data 

は置き換えられません。 (また、桁1と2を区切る唯一のものであれば、スペースを置き換えないでください:"METAL "と置き換えるか、または/^28/を置き換えてください。

+0

良い[:スペース:[]を]それが失敗した理由を説明するための –

関連する問題