bashで次から始めて、終わらない行をファイルから削除します。

bashで次から始めて、終わらない行をファイルから削除します。

特定の文字または文字セットで始まる行を削除する方法については、sedの例をたくさん読んでいましたが、それほど難しくありませんが、この例を解読することはできません。ファイル内の文字「i」で始まり、「.conf」で終わらない行をすべて削除したいと思います。

以下は例のリストです。

include /usr/local/choops/users/2488.conf
include /usr/local/cho
include /usr/local/choops/users/2492.conf
i
incl

上記の例で削除する3行は次のとおりです。

include /usr/local/cho
i
incl

それらは不完全であり、そこにはありません。

StackExchange、StackOverflow、その他のさまざまなフォーラムで、この例のいくつかのバリエーションを試しましたが、正しく理解できないようです。私が試したことは次のとおりです。

sed -i '/^i.*[^\.conf]$/d' /usr/local/choops/users/main.conf

sed -i '/^i.\*\[^\\.conf\]$/d' /usr/local/choops/users/main.conf

sed -i '/^i.*[^.conf]$/d' /usr/local/choops/users/main.conf

ここで、main.confは、上記のように.confファイルセットを一覧表示するファイルです。私はこれがあまりにも複雑ではないと思いましたが、これらのコマンドのどれも私には機能しないようです。さまざまなソースとsedの理解に基づいてコマンドを構築しました。どんな助けでも大変感謝します。とても混乱しています。

以下は私が望むものとは反対ですが、簡単だと思います。

sed -i 's/i.*.conf//' main.conf

ベストアンサー1

同時に満たす必要がある2つの条項があります(「iで始まる」、「.confで終わらない」)。出力から行を除外するには、各句を個別にテストしてから組み合わせる必要があります。

入力例(「i」で始まらない追加の行を追加):

$ cat input.txt 
include /usr/local/choops/users/2488.conf
this line doesn't begin with i
include /usr/local/cho
this line doesn't begin with i but does end in .conf
include /usr/local/choops/users/2492.conf
i
incl

そしてperl

$ perl -ne 'print unless (/^i/ && ! /\.conf$/)' input.txt 
include /usr/local/choops/users/2488.conf
this line doesn't begin with i
this line doesn't begin with i but does end in .conf
include /usr/local/choops/users/2492.conf

そしてsed

$ sed -ne '/^i/ {/\.conf$/!d;};p' input.txt 
include /usr/local/choops/users/2488.conf
this line doesn't begin with i
this line doesn't begin with i but does end in .conf
include /usr/local/choops/users/2492.conf

または@seshoumaraが提案したように(おそらくより良いでしょう):

sed -e '/^i/ {/\.conf$/!d;}' input.txt

3つのバージョンすべてが出力から不要な行を削除し、他のすべての内容を印刷します。

おすすめ記事