数字で始まり終わる行を削除する

数字で始まり終わる行を削除する

詰まった - 次のテキストファイルをパイプします。

cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt

この正規表現は、テキストエディタで行をキャプチャし、それを使用して同じファイル内のすべての空行を削除するときに機能するため、(Linux / Windows)改行形式に問題はないと思います。

なぜこれが行を削除しないのか、どうすればよいのか疑問に思います。

ベストアンサー1

いくつかの追加の注意:

sed '/^[0-9].*[0-9]$/d'

単一の数字を含む行は削除されません(数字で始まり終わった場合でも同じです)。

また、多くのロケールでは、[0-9]数字以外の他の項目も一致することに注意してください0123456789。これらのみを一致させるには、[0123456789]またはが必要です[[:digit:]]

パターンに基づいて行をフィルタリングするより明確なコマンドはですgrep

cat接続コマンドです。個々のファイルをリンクすることはほとんど意味がありません。

ここでこれらの問題をすべて解決し、先行または末尾の空白文字(入力のMS-DOS末尾のキャリッジリターンなど)を無視するには、次のようにします。

<file.txt.in grep -e '^[[:space:]]*[^[:digit:][:space:]]' \
                  -e '[^[:digit:][:space:]][[:space:]]*$' \
                  -e '^[[:space:]]*$' > file.txt.out

(つまり、数字以外のもので始まったり終わったり(前のスペースの後ろまたは末尾のスペースの前に)すべてがスペースである行を返します。

または:

<file.txt.in grep -vx '[[:space:]]*[[:digit:]]\(.*[[:digit:]]\)\{0,1\}[[:space:]]*' > file.txt.out

または ERE と同じです。

<file.txt.in grep -vxE '[[:space:]]*[[:digit:]](.*[[:digit:]])?[[:space:]]*' > file.txt.out

フィルタリングですね出る(使用-v)数字で始まる行(オプション)、数字で終わる残りの行、先頭に許可される空白、およびned。

ただし、現在のロケールで有効な文字を形成していないバイトシーケンスが8xx<non-character>yy8どこにあるかなどの行を削除できない可能性があります。<non-character>しかし、とにかく、無効なテキスト行では移植性があまり期待できません。

おすすめ記事