テキストファイルから視覚的に空白行を削除する方法は?

テキストファイルから視覚的に空白行を削除する方法は?

私はいくつかのテキストファイルを持っていますが、その中には空行、つまり改行文字のみが含まれているか、スペースの後に改行文字が続く可能性があります。コマンドを使用してこれらのファイルを見つけます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つのグラフィック文字を含む行を報告するため、空白行や空白文字、制御文字、未知/未定義/無効な文字のみを含む行は除外されます。

関連情報