VIM或sed删除仅包含BRE为[0-9] {4} \ - [0-9] {2} \ - [0-9] {2}的日期的行

时间:2015-12-22 21:36:32

标签: regex vim sed

我似乎无法弄清楚如何删除这些行。

在VIM中,我尝试了以下操作并且没有执行:

:%s/[0-9]{4}\-[0-9]{2}\-[0-9]{2}/d

然后我收到此错误:找不到模式。

我可以执行以下操作并获得结果:

egrep '[0-9]{4}\-[0-9]{2}\-[0-9]{2}' file

打印出来:

2006-12-18
2007-02-05
2007-02-13
2007-03-06
2007-03-13
2007-04-03
2007-04-15
2007-04-16
2007-04-24
2007-05-18
2007-06-14
2007-07-15
2008-05-14
2008-05-20
2008-06-03
2008-06-10
2008-06-11
2008-06-19
2008-06-25
2008-07-15
2008-07-21
2009-10-21
2010-07-02

在VIM中,我尝试在模式的开头添加^,在结尾添加$,但仍然无法识别模式。

我在使用终端的Mac 10.11.2(15C50)El Capitan上使用VIM。

sed也给了我一些问题。我试过了:

sed -i '/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/d' file

我收到错误:

sed: 1: "file": command c expects \ followed by text

我使用-i使用"sed 's/pattern//g' file"sed -e尝试使用或不使用[0-9],但这些都没有对文件做任何事情。

我也尝试用[:digit:]替换sed -i '/[:digit:]{4}\-[:digit:]{2}\-[:digit]{2}/d' file ,但这也不起作用:

sed: 1: "file": command i expects \ followed by text

结果出现以下错误:

{{1}}

请帮忙。谢谢!

2 个答案:

答案 0 :(得分:3)

  • 您已经知道BRE,然后您应该逃避{以赋予其特殊含义。
  • sed默认使用BRE,但您可以添加-r(gnu sed)让sed与ERE一起使用,然后您的正则表达式就可以正常工作。
  • -不是正则表达式中的特殊字符,(除非它位于[...]之间),所以你不需要转义它
  • 使用vim,默认magic设置为magic,因此您还需要转义{
  • 你可以在vim中做些什么来保存那些逃脱::%s/\vpattern.... \v :%s/../../会让very magic:h magic一起使用。 # @player is the turn taking player def score(game) if game.win?(@player) return 10 elsif game.win?(@opponent) return -10 else return 0 end end 了解详情。

答案 1 :(得分:2)

在Vim中,我认为你有错误的东西被转义,并且正在使用错误的命令 - s是替换,而不是运行行删除命令;尝试

:g/\d\{4}-\d\{2}-\d\{2}/d

(您可以使用[0-9],但\d似乎更整洁 - :help \d说它更快)