无法匹配sed regexp中多次出现的字符

时间:2013-09-17 00:44:41

标签: regex sed

我想在行尾删除As。

alice$ cat pokusni 
SALALAA
alice$ sed -n 's/\(.*\)A$/\1/p' pokusni 
SALALA

一个A被删除就好了

alice$ sed -n 's/\(.*\)A+$/\1/p' pokusni 
alice$ sed -n 's/\(.*\)AA*$/\1/p' pokusni
SALALA

多次出现不是:(

我可能正在做一些非常愚蠢的错误,任何帮助?感谢。

4 个答案:

答案 0 :(得分:4)

试试这个's/\(.*[^A]\)AA*$/\1/p'


为什么+不起作用

因为这里只是一个普通的角色。

为什么's/\(.*\)AA*$/\1/p'不起作用

由于reg-ex引擎非常渴望,因此除.*中指定的最终A外,A将消耗尽可能多AA*秒的A*。 {{1}}只会匹配任何内容。

答案 1 :(得分:2)

这可能对您有用:

sed -n 's/AA*$//p' file

这会替换行尾的A和零个或多个A

N.B。

sed -n 's/A*$//p file' 

会生成正确的字符串,但它会在每一行上运行,因此产生误报。

答案 2 :(得分:1)

使用awk

awk '{sub(/AA$/,"A")}1' pokusni 
SALALA

EDIT 正确的版本,从行尾删除所有A

awk '{sub(/A*$/,x)}1' pokusni 

答案 3 :(得分:1)

您可以使用perl:

> echo "SALALAA" | perl -lne 'if(/(.*?)[A]+$/){print $1}else{print}'
SALAL