【问题标题】:Replacing/removing square brackets in a string替换/删除字符串中的方括号
【发布时间】:2017-10-31 22:54:25
【问题描述】:

我在一个文件中有以下文本:

Names of students
[Name:Anna]
[Name:Bob]
[Name:Carla]
[Name:Daniel]
[ThisShouldNotBeBeRemoved]
End of all names
Blablabla

我想删除文本文件中出现 [Name:xxx] 格式字符串的所有行,xxx 是一个名称,可以是任意长度的字符串,由任意字符组成。

我尝试了以下方法,但没有成功:

$ sed '/\[Name:*\]/d' file > new-file

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 你刚刚错过了.,应该是sed '/\[Name:.*\]/d'...也许你在考虑glob而不是正则表达式?

标签: bash shell unix sed scripting


【解决方案1】:
sed  '/\[Name:[[:alpha:]]+\]/d' file
 Names of students
[ThisShouldNotBeBeRemoved]
End of all names
Blablabla

【讨论】:

  • 你不需要正则表达式功能sed,可以做到POSIX-ly sed
【解决方案2】:

您需要使用.* 而不仅仅是* ...

sed '/\[Name:.*\]/d' file > new-file

* 本身在这种特殊情况下毫无意义。在它表示“匹配任何字符零次或多次”之前添加. - 我认为这是您想要做的。

如果您想对原始文件进行就地编辑而不重定向到新文件:

Linux:

sed -i '/\[Name:.*\]/d' file

macOS:

sed -i '' '/\[Name:.*\]/d' file

* 注意 - 这会覆盖原始文件。

【讨论】:

    【解决方案3】:

    你错过了什么,

    sed '/\[Name:.*\]/d' file > new-file
    

    这将删除匹配的行。

    .*  This matches any character zero or more than once.
    

    【讨论】:

      【解决方案4】:

      我会将grep-v 一起使用

      -v, --invert-match

      反转匹配的感觉,选择不匹配的行。 (-v 由 POSIX 指定。)

      grep -v "\[Name:"
      

      【讨论】:

      • 除非你需要shell解释,否则使用单引号...grep -v '\[Name:'
      • @schorsch312 :由于我们不需要任何正则表达式元字符,grep -vF '[Name:' 会更简单。无需转义括号。
      【解决方案5】:

      或者如果你不想创建新文件,那么试试这个,

      sed -i '/[名称:.*]/d' 文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2011-11-03
        相关资源
        最近更新 更多