sed替换字符串的贪婪匹配和最小匹配

最近在shell对文本进行操作,遇到了使用sed进行最小匹配的问题。sed默认匹配规则是贪婪匹配。

举例来说,如果文本内容为:

(aa)bb(cc)

使用sed匹配:

'/(.*)/'
sed替换字符串的贪婪匹配和最小匹配

匹配结果为:

(aa)bb(cc)
sed替换字符串的贪婪匹配和最小匹配

上述结果即贪婪匹配。

最小匹配的结果是获取规则字符串之间的最小内容,即为:

(aa) (cc)

这两个结果。

sed获取最小匹配的方法:

1.通过 [^str] 的方法找到最近的右侧匹配规则

2.使用perl代替sed。

举例:删除下列字符串中的括号和括号中的内容

(a)bb(ccc)dddd(eeeee)f

使用sed的默认方法(贪婪匹配):

#echo "(a)bb(ccc)dddd(eeeee)f" | sed 's/(.*)//g'
#f

使用第一种方法:

#echo '(a)bb(ccc)dddd(eeeee)f' | sed 's/([^)]*)//g'
#bbddddf
sed替换字符串的贪婪匹配和最小匹配

使用第二种方法:

#echo "(a)bb(ccc)dddd(eeeee)f" | perl -pe 's/\(.*?\)//g'
#bbddddf

另外发现,sed支持的匹配规则与perl不同,关于字符是否需要转义也是不一样的。例如,举例中的 "(" 和 ")" 在sed中不需要转义,在perl中则需要转义。

 

上一篇:正则表达式与文件格式化处理


下一篇:Linux bash 文本处理命令awk,sed,grep 用法