使用sed删除特殊单词

时间:2016-01-16 09:48:32

标签: unix sed

我想使用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'

1 个答案:

答案 0 :(得分:2)

看起来我们在这里遇到了一些问题。第一个是关闭标记中的/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

修改

在评论中,您提到要删除仅包含</ab>的行,而不删除其他内容。为此,您需要执行名为锚定匹配的内容。 ^字符表示锚定行的开头,$表示行的结尾。

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

这只会匹配包含(字面意思)</ab>的行而不包含任何其他行,并删除该行。如果您想匹配包含空格的行,但没有</ab>以外的文字:

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

[[:blank:]]*匹配&#34; 0或更多空白字符&#34;并被称为&#34; POSIX括号表达&#34;。