在sed中使用扩展正则表达式

时间:2016-07-09 01:00:18

标签: bash unix sed

我正在尝试在sed中做一些疯狂的正则表达式但是不允许

我是不是正规表达式或sed

中的正则表达式不同

我正在使用的文件就像

46,uie,ieo
39,ieu,tii
44-46,yut,til
45,dkd,ytu
65,dkd,ytu
40-45,dkd,ytu

当我这样做时

cat text.txt | sed s/^4[0-9],//g

我几乎得到了我想要的东西,我得到了

uie,ieo
39,ieu,tii
44-46,yut,til
dkd,ytu
65,dkd,ytu
40-45,dkd,ytu

但我想摆脱像40-45和44-46那样的人 所以我试过了

cat text.txt | sed s/^4[0-9](-4[0-9])?,//g 
-bash: syntax error near unexpected token `('

当我尝试

cat text.txt | sed s/^4[0-9]-?4?[0-9]?,//g

我得到了

46,uie,ieo
39,ieu,tii
44-46,yut,til
45,dkd,ytu
65,dkd,ytu
40-45,dkd,ytu

所以没有过滤

感谢 - 你!

3 个答案:

答案 0 :(得分:4)

cat text.txt | sed s/^4[0-9](-4[0-9])?,//g

两个问题。

首先,您需要将参数引用到sed。它包含shell识别的元字符,例如(?;你需要引用参数,所以shell将它视为一个字符串而不是试图解释它。

cat text.txt | sed 's/^4[0-9](-4[0-9])?,//g' # this still doesn't work

其次,sed默认情况下不使用扩展正则表达式。如果你正在使用GNU sed(类型sed --version来确认这一点),你可以使用-E选项来启用扩展正则表达式:

cat text.txt | sed -E 's/^4[0-9](-4[0-9])?,//g'

或者您可以使用反斜杠让sed识别()?字符:

cat text.txt | sed 's/^4[0-9]\(-4[0-9]\)\?,//g'

最后,这是一个Useless Use of catsed完全能够从stdin或指定文件读取输入;你不需要通过来自cat的管道输入它的输入:

sed 's/^4[0-9]\(-4[0-9]\)\?,//g' text.txt

-E选项由POSIX指定;我认为这是一个相对较新的补充。 GNU sed自2006年以来一直支持-E(最初与BSD sed兼容),但它目前没有在任何已发布的版本中记录。文档是在2013年添加的,但最新的GNU sed官方版本在2012年是4.2.2。

答案 1 :(得分:0)

您可以使用awk

awk -F, '!/^4[0-9]\>/;{print $2,$3}' text.txt

细节:

!/^4[0-9]\>/ # returns 1 (true) when the line doesn't start with a number between
             # 40 and 49 ( `\>` figures a boundary )
             # (when the expression returns true, the whole line is printed and 
             # awk jumps to the next line)

{print $2,$3} # otherwise fields 2 and 3 are printed

-F,定义了字段分隔符。

答案 2 :(得分:0)

似乎有一些基本的UNIX事情你会出错。需要引用sed的这些论点。它们被shell解释为文件名globs。此外,这是对cat的无关使用,只需使用shell重定向<即可获得相同的效果(并且更有效)。另外,在sed regexp中,()?是普通字符,除非使用\进行转义。结果这对我有用:

sed 's/^4[0-9]\(-4[0-9]\)\?,//g' < text.txt