我是 sed 的新手,正在尝试学习一些东西。但是,在使用 sed 删除重复词时,我遇到了无法解决的问题:
echo "abc abc def ghi ijk ijk" | sed 's/\([a-z][a-z]*\) \1/\1/g'
产出
abc def ghijk ijk
每当一个单词以与下一个单词的第一个字母相同的字母结尾时,它就会这样做。我究竟做错了什么 ?
我是 sed 的新手,正在尝试学习一些东西。但是,在使用 sed 删除重复词时,我遇到了无法解决的问题:
echo "abc abc def ghi ijk ijk" | sed 's/\([a-z][a-z]*\) \1/\1/g'
产出
abc def ghijk ijk
每当一个单词以与下一个单词的第一个字母相同的字母结尾时,它就会这样做。我究竟做错了什么 ?
问题是,按原样,正则表达式可以匹配部分单词。在您显示的示例中,它匹配
i
一个单词末尾的 the 和下一个单词i
的开头。解决方案是坚持正则表达式匹配整个单词:在 GNU sed 中,
\<
匹配单词的开头和\>
结尾。更复杂的比赛
在问题的示例中,正则表达式匹配单个重复字符
i i
. 这是一个匹配的示例oat oat
:这再次通过坚持整个单词来解决:
简化
由于字母表到空格的转换总是标记单词边界,因此上面使用的正则表达式部分
\> \<
是不必要的,因为正则表达式要求两边的字符都是字母。因此,我们可以使用:文档
有关 sed 的精妙之处及其正则表达式的更多信息,我推荐Grymoire 教程。GNU sed 的最终参考是GNU sed 手册。