正则表达式在sed中无法工作

10

我有一个文件里包含这段文字

"0000000441244"
"0000000127769"

我想用 'L' 替换所有的零

我尝试了这个命令,但是没有任何改变:

sed -e 's/0+/L/g' regex.txt

sed -e 's/(0+)/L/g' regex.txt

我想知道我的错误在哪里。

5个回答

17

符合 Posix 标准的版本应该使用 00* 而不是 0+:

sed -e 's/00*/L/g' regex.txt

顺便提一下,只有当你想将"000000012700009""000000012709"转换为"L127L9"时才需要使用g标志。否则,在's/00*/L/'中的*会包括字符串开头的所有零。


7
在Linux(GNU版本的sed)中,sed -e 's/0\+/L/g' regex.txtsed -r 's/0+/L/g' regex.txt都可以使用,但如果你使用的是Mac(BSD版本的sed),两者都无法使用,相反你必须使用:sed -E 's/0+/L/g' regex.txt
实际上,最后一个命令在Linux中也可以使用,因此更具可移植性。对于这个特定的问题,@perreal的建议也具有可移植性。但是当你需要在正则表达式中使用 + 或其他元字符时,最好知道如何解决它。

愿上帝保佑你、你的家人和你的正则技能。我在 BSD 版本的 sed 上感到疯狂了。 - BBerastegui

2

试试这个

sed -e 's/0\+/L/g' regex.txt

0
如果您使用的是除GNU之外的Unix版本,您可以自行安装GNU sed,或者切换到awk、ruby或perl。
例如:
ruby -e 'ARGF.each{|l|puts l.gsub(/0+/, "L")}' regex.txt

使用 awk:
awk '{gsub("0+", "L"); print $0}' regex.txt

通过-E而不是-e,Mac OS/X支持扩展正则表达式。

来自“BSD通用命令手册”:

-E    Interpret regular expressions as extended (modern) regular 
      expressions rather than basic regular expressions (BRE's).
      The re_format(7) manual page fully describes both formats.

为什么人们总是把简单的事情复杂化? - user175386049
哈哈,你不讨厌这种情况吗?仅仅因为你知道00*0+完全一样,并不意味着当你需要它时它就会跳进你的脑海。00* 的解决方案真是太棒了。GNU 也很赞 :) - Ray Toal

0
这可能适用于您(GNU sed):
sed 'y/0/L/' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接