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=""
。