单个 PCRE 正则表达式在字符串中的特定位置将“0”交换为“1”,将“1”交换为“0”

single PCRE regex to swap '0' for '1' and '1' for '0' at a specific location in a string

我的输入字符串在特定位置有一个“0”或一个“1”。 如果它是“1”,我想将其替换为“0”,同样如果它是“0”,则将其替换为“1”。

假设 'x' 永远不会发生并且我的字符串只是一个字符,我可以用 3 个正则表达式来做到这一点:

s/0/x/
s/1/0/
s/x/0/

但这太乱了。我想知道 PCRE 是否有一些奇特的东西可以只用一个表达式来做到这一点?

不确定您的用例是什么,但是使用 sed 怎么样?

echo 'ah1s' | sed 's/0/x/;s/1/0/;s/x/1/'
echo 'ah0s' | sed 's/0/x/;s/1/0/;s/x/1/'

你可以使用像

这样的东西
perl -pe  's/([01])/ 0+! /ge' file

其中 </code> 是捕获的字符串,<code>! 产生它的否定,0+ 强制一个数字上下文。 /g 标志表示处理一行中的每个匹配项,/e 导致替换表达式被评估为 Perl 代码。

IdeOne.com demo

这是一个 gnu-awk 命令,可以在给定输入中将 1 翻转为 0,将 0 翻转为 1:

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "abc1foo0bar"
abc0foo1bar

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "1"
0

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "0"
1

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "foo1"
foo0

awk -v RS='[01]' '{ORS = xor(RT, 1)} 1' <<< "0bar"
1bar

此 awk 命令使用自定义记录分隔符作为 0 或 1,并使用 bitwise xor operation on RT variable.

字符串中存在另一个 x 不是问题,因为您不需要它:

sed 'y/01/10/' input >output

或没有 sed:

tr 01 10 <input >output

我将 的评论作为社区 Wiki 发布,因为我认为这是最好的答案,甚至高于我自己发布的答案。