如何在他的开始,linux终端替换字符串重复模式?

时间:2014-06-09 13:07:19

标签: regex linux terminal csh

我想编辑一个在linux shell中使用正则表达式获得的字符串但是我失败了。

我想要做的是在字符串的开头将“00”的重复发生变为“1”

让我们说:00000120001 to 110100001但我没有那么做。

我试过了:

echo 00000120001 | sed 's/^\`\<00/1/g' 

但获得了1000120001

3 个答案:

答案 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