2017-01-24 4 views
1

に存在しない場合、私はファイルを持って変更を適用し、私はここに、複数のファイルのテストとTEST1に単語ラズベリーを追加していますし、それが正常に動作し、以下の内容はawkの値がファイル

cat file1 
test 
test1 

とをfile1と言います。

while IFS= read -r i; do 
    awk '/\[groups/{a=1;print;next} /^\[/{a=0}a && /=/{$0=$0",raspberry"}7' "$i" > "$i.tmp" && 
    mv "$i.tmp" "$i" 
done < file1 

問題は、スクリプトを10回実行すると、単語「ラズベリー」が10回追加されることです。

ラズベリーが既に存在することを確認できる方法はありますか?それ以外の場合は変更を適用しないと終了しますか?

+1

'/ raspberry/{next}'? –

+1

いくつかのデータと期待される出力を見てみましょう。 –

答えて

0

grepを使用して一致するものを一覧表示し、次にwcを使用してgrepが返す行の数をカウントできます。

#!/bin/bash 
while IFS= read -r i; do 
    #If grep returns zero lines, raspberry was not found: 
    if [[ $(echo $i | grep -c raspberry) -eq 0 ]] 
    then 
     awk '/\[groups/{a=1;print;next} /^\[/{a=0}a && /=/{$0=$0",raspberry"}7' "$i" > "$i.tmp" && 
     mv "$i.tmp" "$i" 
    fi 
done < file1 
+1

'$(cat $ i | grep" raspberry "-wc -l)-eq 0'は' cat($ grep -c raspberry "$ i")-eq 0 'のように書き換えられます。 '$ i'を引用し、' wc -l'を削除します。 – codeforester

+1

それでできます。悪い習慣は激しく亡くなります。あなたの変更を追加する答えを編集します。しかし、簡単な質問です。文字列 'ラズベリー'を「ベストプラクティス」として引用してはいけませんか? – Guest

+0

これは必須ではありません。シェルリテラルであり、空白や特殊文字はありません。 – codeforester

0

これを試してください:

while IFS= read -r i; do 
    awk '/\[/{f=/groups/} f && !/raspberry/{if (NF) $0=$0",raspberry"} 1' "$i" > "$i.tmp" && 
    mv "$i.tmp" "$i" 
done < file 
0
awk ' 
    # reset per file 
    FNR == 1 { a = 0; Fs[FILENAME]++ } 
    # define state of a at [ occurence 
    /^\[/ { a = ($0 ~ /\[groups/) ? 1 : 0 } 

    # modify the line if ... 
    a && /=/ && $0 !~ /raspeberry/ && $0 !~ /\[groups/ { $0 = $0 ",raspberry"} 
    # output the result to tmp file (per filename) 
    { print > (FILEMANE ".tmp") } 

    # mv all tmp to original name 
    END { for (F in Fs) system ("mv " F ".tmp " F) } 
    ' $(cat file1) 
  • 源である(この部分はシェルに最適化することができ、それはサブシェルとして内部MVを呼び出す)1回のAWKコールで行いますループの代わりにファイル1の猫
  • ファイルの開始時に各ファイルをリセットして処理するFNR == 1
  • 私はMV変更したファイル(要求の一部ではない)に任意のチェックを入れていないが、それはに良いアドバイスだ
  • [groupが同じ行に=で発生する可能性があると仮定すると(そうでない場合は、a && /=/ && $0 !~ /raspeberry/ && $0 ~ /\[groups/
  • 簡素化することができます。