搜索和替换内容

搜索和替换内容
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 A 和 PIN C 上的内容,而不影响 PIN B

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/g会将尾随 0 [0Z]:0(其中\K用于标记K匹配中要替换的内容的开始)替换为 3,前提是它们前面和后面是单词边界,以避免在内部b匹配。这不会阻止它在内部匹配,尽管 as和are not0:010:021:0:0.3:.单词字符所以有一个字边界之间:0之间0.

相关内容