Bashを使用してファイルにパラメータを追加する

Bashを使用してファイルにパラメータを追加する

bashを使用してクライアントSeat_numを増やす方法は?私はこのファイルを持っています:

$ cat test
    client1
    name="", possition="", seat_num=""
    client2
    name="", possition="", seat_num=""

この増分が必要です。

client1
name="", possition="", seat_num="1"
client2
name="", possition="", seat_num="2"

このアプローチを試しましたが、目的の効果を得られませんでした。

$ while read -r line; do i=1;echo $line|sed -e 's/seat_num=""/seat_num="$i"/';((i++)); done <<< "$(grep -A 2 client test)"
        client1
        name="", possition="", seat_num="$i"
        client2
        name="", possition="", seat_num="$i"

答え1

使用awk:

awk 'BEGIN{FS=OFS="\""} /seat_num=/{$6=++n}1' test
  • FS=OFS="\""入力フィールドと出力フィールドの区切り記号をに設定します"
  • seat_num=連続して見つかったら、6番目のフィールドをに変更します++n
  • var=++nこれは最初に増加してnから設定することを意味しますvar。対照的に、後でvar=n++設定されvar、増加します。の定義されていない変数のawk値は0++n最初にインクリメント(-->)する必要があります。

-i inplaceファイルを適切に編集するには、可能であれば使用できます。
利用できない場合は追加してください。> test.tmp && mv test.tmp test

答え2

あなたの質問に「増分」(既存の数字に追加、通常は1を加える)が指定されていますが、他のコメントを読みながら感じたことは、ファイル内のクライアントを繰り返して「クライアントの後の数字」を読みたいということです。を作成し、次の行のSeat_numを同じ番号にします。

この場合、次のsedコマンドは私にとって効果的でした。ここでテスト内容は質問と同じです。 (これを行う他の方法がたくさんあると確信しています):

sed 'H;1h;$!d;x; s/client\([0-9]*\)\(\n[^\n]*\)seat_num=""/client\1\2seat_num="\1"/g' <<< cat test

これは@Wiktor Stribizewの答えにある魔法の文字列で始まります。この問題:「(H;1h;$!d;x;ファイルをメモリに入れます)」。マニュアルページを読むと、入力から読み取ったパターン行を「保留スペース」にコピーしてから、パターンを削除し、入力が終了するまで入力から別のパターン行を読み、「保留スペース」を再度「パターンスペース」は次の置換を実行します準備ができています。しかし、まだ詳細がわからないので、喜んで修正します。

client代わりに、ゼロ個以上の数字([0-9]*)が続く文字列を見つけ、エスケープされた角かっこを使用して数字を記憶します\(\)次に、改行文字を探し、その後に改行文字ではなくゼロ個以上の文字(次の文字のみを読み取ることができるようにseat_num)を見つけ、次の文字を探します。seat_num=""もう一度エスケープ括弧を使用して、以前に出てきた文字を思い出してくださいseat_num=

client我々は、それらのすべての元のテキストと記憶された数(最初の記憶された引数を使用)、2番目の記憶された引数、\1その後、元のseat_num="テキストの繰り返しと最初の記憶された引数(次の数字)clientと最後"。これでパターンにファイル全体が含まれているので、このgコマンドを使用してグローバルに置換を実行します。

答え3

seat_num開始1

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

i=1
while IFS= read -r line; do
    if grep -Fq 'seat_num=""' <<< "$line"; then
        sed "s/seat_num=\"\"/seat_num=\"$((i++))\"/" <<< "$line"
    else
        printf '%s\n' "$line"
    fi
done <<< "$(grep -A 2 client test)"

出力:

client1
name="", possition="", seat_num="1"
client2
name="", possition="", seat_num="2"

i行にが含まれている場合は増加しますseat_num=""

関連情報