コンテンツの検索と置換

コンテンツの検索と置換
PIN A
1 1:3 0:8
0 0:0

PIN B
1 1:0
0 0:0
Z Z:0

PIN C
1 1:3 0:8
0 0:0
Z Z:0

PIN Bには影響を与えずにPIN AとPIN Cの内容のみを変更したいと思います。

0 0:3
Z 0:3

一般的な検索と置換方法を使用して、PIN Bの内容に影響を与えずに置き換える方法を見つけることができないようです。

perl -i -pe 's/0:0/0:3/g;' text
perl -i -pe 's/Z:0/Z:3/g;' text

希望の出力:

PIN A
1 1:3 0:8
0 0:3

PIN B
1 1:0
0 0:0
Z Z:0

PIN C
1 1:3 0:8
0 0:3
Z Z:3

答え1

-00レコードが空白行で区切られた段落モードを使用して、次のことができます。

perl -00 -i -pe 's/\b[0Z]:\K0\b/3/g if /^PIN (A|C)\b/' text

(またはif /^PIN [AC]\b/単一文字のPINのみ)

または:

perl -00 -i -pe 's/\b[0Z]:\K0\b/3/g unless /^PIN B\b/' text

より一般的なアプローチは記録することです。現在のパスワード変数を選択し、その変数に必要な値がある場合は置き換えます。

perl -i -pe '
  if (/^PIN (.*)/) {
    $pin = $1;
  } else {
    s/\b[0Z]:\K0\b/3/g unless $pin eq "B";
  }' text

これは、内部的に一致を避けるために、前後に単語の境界がある場合、末尾s/\b[0Z]:\K0\b/3/g0 [0Z]:0(一致で置き換えられる項目の先頭を\K示すために使用されます)を3に置き換えます。これはasとそうでなくても内部的に一致することを妨げません。Kb0:010:021:0:0.3:.単語文字だからそこに単語の境界:00.

関連情報