如何用sed“debugging”正则expression式?

我正在尝试使用sed正则expression式。 我用kiki(一个testingregexpd的gnome应用程序)testing了我的正则expression式,它在kiki中有效。

 date: 2010-10-29 14:46:33 -0200; author: 00000000000; state: Exp; lines: +5 -2; commitid: bvEcb00aPyqal6Uu; 

我想replaceauthor: 00000000000; 什么都没有 所以,我创build了正则expression式,当我在kiki中testing时,

 author:\s[0-9]{11}; 

但是,当我在sedtesting它不起作用。

 sed -i "s/author:\s[0-9]{11};//g" /tmp/test_regex.txt 

我知道正则expression式有不同的实现,这可能是问题。 我的问题是:我怎么至less尝试“debugging”与sed发生了什么? 为什么它不工作?

我的版本的sed不喜欢{11}位。 处理行:

 sed 's/author: [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9];//g' 

工作正常。

我调试的方式正是我在这里所做的。 我刚刚构建了一个命令:

 echo 'X author: 00000000000; X' | sed ... 

并一次删除了更高级的正则表达式:

  • 使用<space>而不是\s ,没有解决它。
  • 取代[0-9]{11}[0-9] 11份,工作。

sed成功之前,我已经使用了正则表达式的所有其他特性,所以它几乎是其中之一。

但是,事实上,这实际上没有[0-9]的可怕的11个副本,你只能逃避括号[0-9]\{11\} 。 我不得不承认,我没有考虑到这一点,因为它可以用倍数工作,我一般不会在sed过多地关注自己,因为我倾向于更多地使用它来做快速的工作: )

但支撑方法更加简洁和适应性强,并且知道如何去做。

在SED你需要摆脱大括号。 "s/author:\s[0-9]\{11\};//g"应该可以工作。

Sed没有调试功能。 要测试你在命令行迭代地简化,直到你得到一些工作,然后建立备份。

命令行输入:

 $ echo 'xx a: 00123 b: 5432' | sed -e 's/a:\s[0-9]\{5\}//' 

命令行输出:

 xx b: 5432 

Aurelio Jargas提供了一个名为sedsed的Python脚本,它将显示sed脚本的逐步执行。 像这样的调试器在字符被字面上使用(例如{ )而不是具有特殊含义(例如\{ ))的情况下不会有太大的帮助,特别是对于简单的替换,但是当更复杂的脚本正在被调试。

最新的SVN版本
最近的稳定版本 。
免责声明:我是一个小小的贡献者。

sedsed example

另一个sed调试器,由Brian Hiles编写,编写成Bourne shell脚本(我没有使用过这个脚本)。

你必须使用扩展正则表达式的-r标志:

 sed -r 's/author:\s[0-9]{11};//g' 

或者您必须转义{}字符:

 sed 's/author:\s[0-9]\{11\};//g' 

您正在使用-i标志不正确。 你需要把它给一个字符串放在临时文件。 你也需要摆脱你的大括号。

 sed -ibak -e "s/author:\s[0-9]\{11\};//g" /tmp/test_regex.txt 

我通常通过从一个我知道会工作的正则表达式开始调试我的声明(在这种情况下就像's / author // g')。 当这个作品,我知道我有正确的论点。 然后我递增扩展正则表达式。

这看起来更像是一个perl正则表达式,而不是一个sed正则表达式。 也许你更喜欢使用

 perl -pi.orig -e 's/author:\s[0-9]{11};//g' file1 file2 file3 

至少这样你总是可以添加-Mre=debug来调试正则表达式。

事实上,你代替author: 00000000000已经说过,当你在第一个/之前添加s