私はいくつかのテキストファイルを持っていますが、その中には空行、つまり改行文字のみが含まれているか、スペースの後に改行文字が続く可能性があります。コマンドを使用してこれらのファイルを見つけますfind
。
- サンプルファイル
#Title 1 12345678 1234 #Title 2 12345678 1234 12345678 1234
- 期待される出力
#Title 1 12345678 1234 #Title 2 12345678 1234 12345678 1234
これらの空白行をすべて削除したいと思います。次のコマンドを使用してDebian Linux Stretchで試しました。
cat "/path/to/file" | sed '/^\s*$/d' | sponge "/path/to/file";
たとえば、一部のファイルには4つ以上の空白行がありますが、上記のコマンドは後ろの空白行の1つを除いてすべて削除します。
最後の空行をどのように削除しますか?上記のように、ファイルに空白行がまだある場合は、この行も削除する必要があります。
ファイルはBASH変数の順序付き配列に格納されるため、ファイル間の一貫性を取得しようとしています。その後、ファイルを繰り返し、すべての空行と末尾の空行を削除します。一方、一部のファイルにはすでに空白行または末尾の空白行がありません。
答え1
あなたの質問を正しく理解したら、テキストファイルから(実際または視覚的に)空白行を削除したいと思います。これはEasyを使用して行うことができますawk
。
単一ファイルの場合は呼び出すことができます。
awk 'NF' /path/to/file
これにより、その行に「空白ではない」文字が1つ以上含まれているファイルのみが印刷されます。これに対するアイデアは、入力行がawk
基本的に「空白」から「フィールド」、つまり連続した空白とタブに分割されることです。ただし、行に対応する文字のみが含まれている場合、自動変数に内部的に格納されているフィールドの数はNF
「0」として認識されます。上記の(やや短い)プログラムは、NF
現在の行を印刷するためにゼロでなければならないという条件を課します。これにより、実際または「視覚的に」空白行が効果的に削除されます。
インライン編集はデフォルトでは行われないため、awk
出力を一時ファイルにリダイレクトしてから名前を変更したり、拡張を理解したりするのに十分な新しい実装を使用する必要があります-i inplace
。
awk -i inplace 'NF' /path/to/file
答え2
空白以外の内容を含む行のみを含む別の移植可能な方法は次のとおりです。
grep '[^[:space:]]' file
他のコマンドにも同じアプローチを使用できます。
sed -n '/[^[:space:]]/p' file
ソースと同じファイルに書き込むのはかなり標準的なプロセスです。いくつかのコマンドは-i
(または同等のもの)を使用して表されます。所定の位置に編集しますが、実際には一時ファイルに書き込んでから、元のファイルを一時ファイルで上書きします。
some_command file >file.tmp && mv -f file.tmp file
rm -f file.tmp
file
他の場所にハードリンクがない場合、これは非常に効果的です。この状況を満たすには二重コピーが必要です。
some_command file >file.tmp && cat file.tmp >file
rm -f file.tmp
答え3
残念ながら、問題はmacOSでのみ再現できます。 macOSでは、パターンはゼロ文字以上のすべての行に一致することがsed
わかり\s
ます。これs
^\s*$
s
含む空行。ただし、スペースなどの文字のみを含む行ではありません。
空白行、空白またはタブのみを含む行を削除する移植可能な方法は次のとおりです。
grep -v -x '[[:blank:]]*' file
grep
これは、一致しない行のみを抽出するために使用されます[[:blank:]]*
。この[[:blank:]]*
パターンは、ゼロ以上のスペースまたはタブと一致します。より大きなスペースに似た文字セット(キャリッジリターン、垂直タブなどを含む)を一致させるには、代わりにを使用します[[:space:]]*
。この-x
オプションは、grep
パターンが完全な行に一致するように強制します(式を使用して固定したように^
)$
。
答え4
あなたが使用できる:
grep '[[:graph:]]'
少なくとも1つのグラフィック文字を含む行を報告するため、空白行や空白文字、制御文字、未知/未定義/無効な文字のみを含む行は除外されます。