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


12

我有一个html文件。我要删除所有不以开头的行<tr>

我试过了:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

但它删除了所有行。


3
更加轻松grep
jcbermu 2015年

1
s/^[^tr]...匹配以t或以外的任何字符开头的行r。方括号是正则表达式中的字符范围。
彼得·科德斯

Answers:


19

尝试使用GNU sed:

sed -n '/^<tr>/p' file

要么

sed '/^<tr>/!d' file

1
我发现该版本!d特别有用,因为它使您可以在表达式中编写另一个sed命令,而p仅打印匹配项,但下一个命令的输入未打乱。
jirislav

9
sed -e '/^<tr>/d'

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

更新:糟糕,很抱歉我看到你说不。所以

sed -e '/^<tr>/!d'

!否定了比赛的感觉。


3

如果必须sed

sed -ni '/^<tr>/p' file

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

grep

grep -E '^<tr>' file

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

awk

awk '/^<tr>/' file

还是纯的bash

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

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


您的纯现金版本无法引用"$l"。而且您将其作为echo命令行的第一个参数,因此如果以-option。开头,则会遇到问题。(使用printf '%s\n' "$l"). Also, shell read`具有读取一个字节-AT-A-时间,所以它的超慢的纯bash的处理文本文件通常不是一个好的选择,除非你知道你的文件是非常小的。
彼得·科德斯

2

最简单的答案是:

grep '^<tr>' path/to/file 

如果您不想直接修改文件(如sed),这将仅以开头的行打印文件。

然后,如果您喜欢在输出中看到的内容,则可以使用 > file

在这种情况下,您可以节省一些时间来备份文件,然后再尝试一些命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.