【问题标题】:Delete Special Word Using sed使用 sed 删除特殊字
【发布时间】:2016-01-17 07:24:19
【问题描述】:

我想使用 sed 删除此行的所有出现当且仅当它是这个

<ab></ab>

如果这一行,我不想删除它

<ab>keyword</ab>

我的尝试不起作用:

sed '/<ab></ab>/d'

感谢您的任何见解。 我不知道出了什么问题,因为我不应该逃避任何事情?


我正在使用一个名为 temp 的 shell 脚本来执行它。我的命令是这样的:

cat foobar.html | ./temp

这是我的临时 shell 脚本:

#!/bin/sh
sed -e '/td/!d' | sed '/<ab></ab>/d'

【问题讨论】:

  • 您使用的确切命令是什么?
  • @Will 我会把它写成一个叫做 temp 的 shell 脚本,因为它写成:cat foobar.html | ./temp
  • @Will 这是我的临时 shell 脚本:#!/bin/sh sed -e '/td/!d' | sed '//d'
  • 知道了,谢谢!我的回答应该能解释一切。另外,您说这是 UNIX;你知道什么品种吗?这是 Linux、FreeBSD 还是某种类型的实际 UNIX?你能跑uname -a吗?无论哪种方式,我下面的答案都应该适用于任何 POSIX sed

标签: unix sed


【解决方案1】:

看起来我们这里有几个问题。第一个是关闭标签中的/sed 使用它来分隔命令的不同部分。幸运的是,我们所要做的就是用\ 逃脱它。试试:

sed '/<ab><\/ab>/d'

这是我机器上的一个例子:

$ cat test
<ab></ab>
<ab></ab>
<ab>test</ab>
$ sed '/<ab><\/ab>/d' test
<ab>test</ab>
$

另一个问题是我不确定sed -e '/td/!d' 的目的是什么。在它的默认操作模式下,你不需要告诉它不要删除一些东西;直接告诉它你想删除什么。

所以,要在一个名为 input.html 的文件上执行此操作:

sed '/<ab><\/ab>/d' input.html

或者,要就地编辑文件,您可以这样做:

sed -i -e '/<ab><\/ab>/d' input.html

此外,sed 允许您使用任何您想要的字符作为分隔符;您不必使用/。所以如果你不想逃避你的输入,你可以这样做:

sed '\@<ab></ab>@d' input.html

编辑

在 cmets 中,您提到要删除仅包含 &lt;/ab&gt; 而没有其他内容的行。为此,您需要执行所谓的锚定匹配^ 字符代表锚定行的开头,$ 代表行尾。

sed '/^<\/ab>$/d' input.html

这将只匹配包含(字面意思)&lt;/ab&gt; 并且根本没有其他内容的行,并删除该行。如果你想匹配包含空格的行,但除了&lt;/ab&gt;之外没有其他文本:

sed '/^[[:blank:]]*<\/ab>[[:blank:]]*$/d' input.html

[[:blank:]]* 匹配“0 个或多个空白字符”,称为“POSIX 括号表达式”。

【讨论】:

  • 谢谢你的作品!但是如果我想删除,为什么会这样,我试试这个,它不起作用:sed'//d'
  • 您要删除包含&lt;/ab&gt; 的整行还是只删除&lt;/ab&gt; 本身? sed '/&lt;\/ab&gt;/d' 将删除任何包含 &lt;/ab&gt; 的行。
  • 我想删除整行当且仅当它包含 ,仅此而已
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2012-09-09
相关资源
最近更新 更多