我正在尝试使用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};
但是,当我在sed
testing它不起作用。
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版本
最近的稳定版本 。
免责声明:我是一个小小的贡献者。
另一个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
。