Bash 删除包含插入符号(^)的所有行

Bash 删除包含插入符号(^)的所有行,bash,sed,Bash,Sed,我尝试了sed-I'/^/d'myfile,它删除了整个文件。如何避免这种情况?我想删除其中包含^的所有行 sed -i '/\^/d' myfile 您需要转义特殊字符。在正则表达式中,“特殊”字符存在于括号表达式(方括号)中时将失去其特殊含义。因此,您可能认为搜索[^]将是您所需要的 唉,事实证明,虽然这适用于插入符号,但当插入符号是括号表达式的第一个字符时,它也获得了不同的特殊含义。它用于否定这些表达式。因此,[^]实际上是无效的正则表达式语法,这个字符仍然需要转义 在GNU sed中,

我尝试了sed-I'/^/d'myfile,它删除了整个文件。如何避免这种情况?我想删除其中包含
^
的所有行

sed -i '/\^/d' myfile

您需要转义特殊字符。

在正则表达式中,“特殊”字符存在于括号表达式(方括号)中时将失去其特殊含义。因此,您可能认为搜索
[^]
将是您所需要的

唉,事实证明,虽然这适用于插入符号,但当插入符号是括号表达式的第一个字符时,它也获得了不同的特殊含义。它用于否定这些表达式。因此,
[^]
实际上是无效的正则表达式语法,这个字符仍然需要转义

在GNU sed中,您所寻找的可能是:

sed -i '/[\^]/d' myfile
这看起来很尴尬(特别是与@threadp的答案相比),但我更喜欢方括号方法来转义特殊字符,因为它对所有其他特殊字符的处理方式都是相同的,并且它的行为在正则表达式解析器中是一致的。反斜杠还用于其他用途——在shell脚本中继续行,将字符转换为特殊字符(
\n
\t
,等等)。太多的反斜杠会使事情变得混乱

值得注意的一件有趣的事情是,插入符号只有在括号表达式中是第一个字符时才是特殊的。因此,以下工作:

$ printf 'one\ntwo^\n' | sed -ne '/[X^]/p'
two^

这一点在《最终阅读》一书中得到了回答:我的问题是一克拉,不是一个字符,但我的标题被更改了。我的坏问题,已经解决了。无论如何,也许标题可以改为“特殊字符”,使其更通用?@Pete如果你在vi中看到“^标记,这意味着“^带有某物”是一个特殊字符,而不是文字^。你最好考虑编辑你的问题。请注意这个字符。有问题的是拼写,不是。我一般喜欢
[]
方法,但在
^
的具体情况下,我不太确定,因为
^
是字符类中的第一个字符时也是一个特殊字符。总的来说,这很好,但
^
实际上是一个且唯一的字符。即使在字符集内部,它也需要作为第一个字符转义,因为它在那里确实有特殊的含义:否定由剩余字符组成的字符集/范围;因此,在这种情况下,您确实需要
[\^]
;把其他的东西放进去。您希望在
[…]
中被视为文本,但是,如果适用,请将
-
放在末尾,以避免其在字符集中的特殊解释(作为范围运算符)。@mklement0,哇,我不常在sed或regex中犯这样的错误。谢谢你强调这一点,并提供你明确的解释,我会更正我的答案。