sed - 如何删除所有不匹配的行

Mic*_*ant 27 sed text-processing

我有一个 html 文件。我想删除所有<tr>.

我试过:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'
Run Code Online (Sandbox Code Playgroud)

但它删除了所有行。

Cyr*_*rus 36

用 GNU sed 试试这个:

sed -n '/^<tr>/p' file
Run Code Online (Sandbox Code Playgroud)

或者

sed '/^<tr>/!d' file
Run Code Online (Sandbox Code Playgroud)

  • 我发现带有 `!d` 的版本特别有用,因为它使您能够在表达式中编写另一个 sed 命令,而 `p` 只打印匹配项,但下一个命令的输入不变。 (2认同)
  • @DarkSkull:我建议查看此处的文档,因为这是 GNU sed 和 BSD sed 的不同之处。 (2认同)

use*_*445 13

sed -e '/^<tr>/d'
Run Code Online (Sandbox Code Playgroud)

之间的部分/是一个正则表达式。该d命令删除匹配的行。

更新:哎呀,对不起,我看到你说不。所以

sed -e '/^<tr>/!d'
Run Code Online (Sandbox Code Playgroud)

哪里!否定了比赛的意义。


cha*_*aos 7

如果必须是sed

sed -ni '/^<tr>/p' file
Run Code Online (Sandbox Code Playgroud)

-i就地编辑文件,-n防止sed打印所有行,正则表达式意味着匹配所有以 ( ^)开头的行<tr>,并且将打印这些行 ( p)。

grep

grep -E '^<tr>' file
Run Code Online (Sandbox Code Playgroud)

使用-Egrep 解释扩展正则表达式。

awk

awk '/^<tr>/' file
Run Code Online (Sandbox Code Playgroud)

或纯bash

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file
Run Code Online (Sandbox Code Playgroud)

[[bash 内部条件表达式。我们$l与正则表达式进行比较,如果成功 ( &&),我们将打印该行echo