sed-一致しないすべての行を削除する方法


12

HTMLファイルがあります。で始まらないすべての行を削除したい<tr>

私は試した:

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

しかし、それはすべての行を削除しました。


3
で簡単にgrep
jcbermu

1
s/^[^tr]...tまたは以外の文字で始まる行に一致しますr。大括弧は、正規表現の文字範囲です。
Peter Cordes

回答:


18

GNU sedでこれを試してください:

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

または

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

1
は一致を出力するだけですが、次のコマンドの入力は変更されていませんが!d、式内で別のsedコマンドを記述できるため、バージョンが特に便利ですp
ジリスラフ

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ます。


あなたの純粋なbashバージョンは引用に失敗します"$l"。そしてecho、それをのコマンドラインの最初の引数として配置するので、で始まる場合は問題が発生します-option。(使用しprintf '%s\n' "$l"). Also, shell 、それは超遅いですのでread`は、アット・タイム1バイトを読み込みしなければならない処理のテキストファイルは、純粋なbashで、あなたのファイルが非常に小さいことを知っている場合を除き、通常は良い選択ではありません。。
ピーター・コルド

2

最も簡単で簡単な答えは次のとおりです。

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

これは、ファイルを直接変更したくない場合(sedのように)で始まる行で始まるファイルのみを出力します。

次に、出力に表示されるものが気に入ったら、次のようにしてファイルに出力することができます。 > file

この場合、いくつかのコマンドを実行する前に、ファイルをバックアップする時間を節約できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.