3

私は、スーパーコンピューターでシミュレーションを管理する必要性から始めたので、bashスクリプトに比較的慣れていません。私は現在、pbsファイルの特定の行を変更するためのスクリプトを書くことに固執しています。

私の問題には2つの段階があります。まず、テキストファイル(別のスクリプト)の行数を置き換え、後で使用するためにそのファイルを上書きする必要があります。大まかなアイデアは次のとおりです。

の27、28、29行目を、に'filename005'置き換え'text1=000'ます'text2=005''text3=010'

次に、接尾辞に番号が付けられた一連のテキストファイルに対してこれを再帰的に実行したいと思います。番号は、置き換えられるテキストに影響します。

これまでの私のコードは次のとおりです。

#!/bin/bash
for ((i = 1; i < 10; i++))
    do
    let NUM=i*5
    let OLD=NUM-5
    let NOW=NUM
    let NEW=NUM+5

    let FILE=$(printf "filename%03g" $NUM)
    sed "27 c\text1=$OLD" $FILE
    sed "28 c\text2=$NOW" $FILE
    sed "29 c\text3=$NEW" $FILE
done

コードの最後の4行にエラーがあることはわかっていますが、を実装する適切な方法についてはまだ検討中ですsed。ヒントに感謝します!

ありがとう!CS

4

2 に答える 2

1

仕様の最初の行を取る:

Replace lines 27:29 of filename005, with text1=000; text2=005; text3=010

それは次のようになります:

sed -e '27,29c\
text1=000\
text2=005\
text3=010' filename005

すすぎ、繰り返します。バックスラッシュはsed、変更が継続することを示します。実際のデータ行を円記号で終わらせる必要がない場合は、自分で簡単にできます。

あなたは遊ぶことができます:

seq 1 35 |
sed -e '27,29c\
text1=000\
text2=005\
text3=010'

貴重なファイルに損傷を与えるリスクを冒さずに何が起こるかを確認します。仕様の行があれば、仕様からsedスクリプトを生成するsedスクリプトを書くことができます(ただし、Perlを使用したくなるか、awk代わりに、Perlですべての作業を行う可能性があります)。

于 2012-11-02T05:16:29.413 に答える
0

さて、インライン置換のために一時ファイルに書き込む必要があることを知った後、コードを機能させることができました。したがって、再帰ループと複数行の置換(およびその他の小さな調整)を使用すると、次のようになります。

for ((i = 1; i < 10; i++ ))
    do
    let NUM=i*5
    let OLD=NUM-5
    let NOW=NUM
    let NEW=NUM+5

    FILE=`printf "filename%03g" $NUM`

    sed -e "27,29 c\
    OLD=$OLD\n\
    NOW=$NOW\n\
    NEW=$NEW" $FILE >temp.tmp && mv temp.tmp $FILE
done

sedこのコンテキストで使用するよりエレガントな方法があるかどうかを教えてください。もう一度ありがとう@Johnathan!

于 2012-11-04T08:36:25.223 に答える