我想编辑一个在linux shell中使用正则表达式获得的字符串但是我失败了。
我想要做的是在字符串的开头将“00”的重复发生变为“1”
让我们说:00000120001 to 110100001
但我没有那么做。
我试过了:
echo 00000120001 | sed 's/^\`\<00/1/g'
但获得了1000120001
答案 0 :(得分:2)
使用Perl命令行:
echo 00000120001 | perl -pe 's/(?|^(.)|\G(?<=(.))\1)\1/1/g'
仅限零:
echo 00000120001 | perl -pe 's/\G00/1/g'
答案 1 :(得分:1)
不确定是否可以使用单个正则表达式执行此操作;我有一个解决方案,与sed
的保持和模式空间混淆。
在一行中:
sed 'h;s/[^0].*//;s/00/1/g;x;s/^0*//;x;G;s/\n//' <<< '00000120001'
详细信息:
sed 'h # copy input line to hold space
s/[^0].*// # keep only 00..0 preffix in pattern space
s/00/1/g # replace double 0s by 1s in pattern space
x # swap hold and pattern spaces (hold is now 110, pattern 00000120001
s/^0*// # remove 00..0 prefix from pattern space
x # swap hold and pattern spaces (hold is now 120001, pattern 110
G # append hold space to pattern space (pattern is 110\n120001)
s/\n//' # remove \n from pattern
<<< '00000120001'
答案 2 :(得分:0)
使用gnu awk
即可:
echo '00000120001' | awk '$0==""{printf "1"} $0 && !index($0, "\n")
{p=1; printf $0 RS; next} $0{printf $0}' RS='00'
110120001