为什么不能匹配sed中#和end行之间的内容?

时间:2013-12-30 07:13:31

标签: sed

$ echo "haha#nihao" | sed "s/#.+$/end/"
haha#nihao

我想匹配字符#和行尾之间的内容。为什么我不能得到它?

:%!sed  "s/#.\+$/end/" 
E194:No alternate file name to substitute for '#'    
问题1: 为什么我不能在vim的sed中使用它?

问题2: 怎么看EORROR 194?

2 个答案:

答案 0 :(得分:1)

  

问题1:为什么我不能在vim的sed中使用它?

因为默认情况下sed使用BRE,所以使用基本的正则表达式:

  • /.+/这匹配任何字符后跟“+”
  • /.\+/匹配任何字符的一个或多个匹配项

您可以告诉sed在GNU实现中使用带有-r标志的扩展正则表达式,并使用带有BSD实现的-E标志:

$ echo "haha#nihao" | sed -r "s/#.+$/end/"
hahaend
  

问题2:如何看EORROR 194?

您收到此错误是因为当您使用#运行命令时,vim!中具有特殊含义:命令行上的#标记将替换为备用文件。如果你逃避#

,它应该有效
%!sed "s/\#.\+$/end/" 

您可以使用:help E194命令以及:help alternate-file的备用文件来了解此错误。

答案 1 :(得分:0)

使用sed -r

echo "haha#nihao" | sed -r "s/#.+$/end/"
hahaend

来自man sed

   -r, --regexp-extended

          use extended regular expressions in the script.