单个PCRE正则表达式交换' 0'对于' 1'和' 1'为' 0'在字符串中的特定位置

时间:2015-05-17 08:33:16

标签: regex pcre

我的输入字符串有' 0'或者' 1'在特定的位置。 如果它是' 1',我想用' 0'替换它。同样,如果它' 0' 0将其替换为' 1'。

按照假设进行工作' x'永远不会发生,我的字符串只是一个字符,我可以用3个正则表达式来完成:

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

但那太乱了。我想知道PCRE是否只有一个表达式可以做到这一点?

4 个答案:

答案 0 :(得分:4)

字符串中存在其他x不是问题,因为您不需要它:

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

或没有sed:

tr 01 10 <input >output

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

答案 1 :(得分:2)

您可以使用类似

的内容
perl -pe  's/([01])/ 0+!$1 /ge' file

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

IdeOne.com demo

答案 2 :(得分:2)

这是一个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

答案 3 :(得分:1)

不确定你的用例是什么,但是使用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/'