我正在尝试在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
所以没有过滤
感谢 - 你!
答案 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 cat
。 sed
完全能够从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