【问题标题】:VIM or sed to remove a line that contains only a date with BRE of [0-9]{4}\-[0-9]{2}\-[0-9]{2}VIM 或 sed 删除仅包含 BRE 为 [0-9]{4}\-[0-9]{2}\-[0-9]{2} 的日期的行
【发布时间】:2015-12-22 21:36:32
【问题描述】:

我似乎不知道如何删除这些行。

在 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,使用"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

请帮忙。谢谢!

【问题讨论】:

    标签: regex vim sed


    【解决方案1】:
    • 你已经知道BRE,那么你应该转义{,赋予它特殊的意义。
    • sed 默认使用 BRE,但您可以添加 -r (gnu sed) 让 sed 与 ERE 一起工作,然后您的正则表达式应该可以工作。
    • - 不是正则表达式中的特殊字符,(除非它位于 [...] 之间),所以你不需要转义它
    • 使用vim,默认magic设置为magic,所以你也需要转义{
    • 你可以在 vim 中做些什么来保存那些转义是::%s/\vpattern.... \v 将让 :%s/../../very magic 一起工作。 :h magic了解详情。

    【讨论】:

    • 这很有帮助。谢谢。
    • 只是为了确认一下,如果我像 VIM 一样将sed '/[0-9]\{4}-[0-9]\{2}-[0-9]\{2}/d' file', would that delete this pattern globally or on the first string? If only the first string, should I add the g' 跑到前面,例如 `sed 'g/[0-9]\{4}-[0-9]\{2 }-[0-9]\{2}/d'文件'?谢谢!!!
    • @technerdius 首先,您的模式(正则表达式)不正确。你也应该转义}。 sed 行将删除包含该模式的行。您可以实际测试并查看结果。
    • 是的,我明白了。谢谢。
    • 我创建了一个名为 testsed.txt 的测试文件。我只包含那些日期和末尾的一行 test text.' I used sed -i.bk '/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{ 2\}/d'tested.txt'。奇怪的是,它不能仅与 -i'. I had to include the .bk' 一起工作。
    【解决方案2】:

    在 Vim 中,我认为您转义了错误的内容,并且使用了错误的命令 - s 用于替换,而不是运行 line delete 命令;试试

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

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

    【讨论】:

    • @technerdius 这不是魔法,它magic,vim的magic
    • 并且应该注意,\dBRE 一起使用,ERE 一起使用。但它适用于PCRE
    • 它在 Mac El Capitan 终端上运行。所以,我猜那是PCRE。感谢您提供这些信息。
    • 我不知道@Kent 想要说明什么,但 Vim 正则表达式不是 PCRE、BRE 或 ERE,它们是从那些存在之前的时间(stackoverflow.com/a/13999104/478656)下降而来的。既然您在标题中提到了 BRE,并提到了“sed”,也许看起来您想要一个与 BRE 兼容的正则表达式,而我的回答中的 \d 与它不兼容(我个人不太熟悉这些差异)。
    • @TessellatingHeckler 这就是我的意思。 \d 适用于 vimregex,但 BRE 不支持它 (\d -> [0-9])。由于OP提到了有问题的BRE。
    猜你喜欢
    • 2013-07-15
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2020-04-01
    相关资源
    最近更新 更多