詰まった - 次のテキストファイルをパイプします。
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>
しかし、とにかく、無効なテキスト行では移植性があまり期待できません。
答え2
もし
cat file1.txt | sed '/^\s*$/d' > file2.txt
有効ですが
cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt
いいえ(電子のように働きたいのですが)。
入力ファイルにWindowsキャリッジリターンを含めることができることを考慮すると、次のコマンドを使用する方が安全です。
cat file1.txt | sed '/^[0-9].*[0-9]\(\r\|$\)/d' > file2.txt
これは、LinuxまたはWindowsキャリッジリターンで終わる行を含むすべての場合に機能します。