sed:正規表現を含む行を削除する

sed:正規表現を含む行を削除する

私のログファイルには次のものがあります。

[2.09 10:23:56] 
[23.09 10:3:56] 
[23.09 10:23:56] Some other thing
[23.09 10:23:56] 
[23.09 10:23:56] 
[23.09 10:23:5] 
[23.09 10:23:56] Something
[23.09 10:23:56] 

sedを使用して「空の」行(タイムスタンプのみを含む行)を削除しようとしています。私は以下を試しました:

sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file

しかし、何も動作しないようです。

助けてくれてありがとう!

ベストアンサー1

私が知っている限り、行の先頭の括弧内の日付文字列に一致する式を作成する必要はありません。

$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

上記のコマンドは、[like this]角かっこで囲まれた文字列()で始まり、オプションの末尾の空白のみを含む行を削除します。

それでsed、これは次のようになります

$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

式は\[[^]]*\]リテラルで始まり、[その後にゼロ個以上の非文字が続き、]最後にリテラルが続きます]

を使用してawkフィールド区切り記号をに設定できます][[:blank:]]*。つまり、]末尾のタイムスタンプ(およびその後のすべてのスペース)が2つのフィールド間の区切り文字になります。 2番目のフィールドが空の場合、現在の行は印刷されません。

$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

〜のようにクワジモドawk 'NF > 2' fileを使用すると、質問に提供されているサンプルデータでも機能するというコメント(現在削除済み)で指摘されています。この方法は、awk基本的に行が空のフィールドに分割されるという事実に依存します。このバリエーションは各行の詳細を考慮せず、空白で区切られたフィールドが2つ以上ある行を除くすべての行を削除します。

おすすめ記事