![sed - 如何删除所有不匹配的行](https://linux22.com/image/71131/sed%20-%20%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E4%B8%8D%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
我有一个 html 文件。我想删除所有这样做的行不是从...开始<tr>
。
我试过:
cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'
但它删除了所有行。
答案1
使用 GNU sed 试试这个:
sed -n '/^<tr>/p' file
或者
sed '/^<tr>/!d' file
答案2
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
使用-E
grep 解释扩展正则表达式。
和awk
:
awk '/^<tr>/' file
或纯bash
:
while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file
是[[
bash 内部条件表达式。我们$l
与正则表达式进行比较,如果成功 ( &&
),我们将打印该行echo
。
答案4
最简单和最简单的答案是:
grep '^<tr>' path/to/file
如果您不想直接修改文件(就像使用 sed 一样),这将仅打印以以下行开头的文件,这可能会很好。
然后,如果您喜欢在输出中看到的内容,您可以将其打印到文件中> file
在这种情况下,您可以在尝试某些命令之前备份文件,从而节省一些时间。