![搜索和替换内容](https://linux22.com/image/227136/%E6%90%9C%E7%B4%A2%E5%92%8C%E6%9B%BF%E6%8D%A2%E5%86%85%E5%AE%B9.png)
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:0
10:02
1:0:0.3
:
.
单词字符所以有一个字边界之间:
和0
之间0
和.
。