单个 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 代码。
这是一个 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 发布,因为我认为这是最好的答案,甚至高于我自己发布的答案。
我的输入字符串在特定位置有一个“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 代码。
这是一个 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
我将