コマンドラインを使用して、Unix/Linuxでファイルの空/空白(スペースのみを含む)行を削除するにはどうすればよいですか?
file.txtの内容
Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD
望ましい出力
1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
次のsed行でうまくいくはずです。
sed -i '/^$/d' file.txt
-i
は、ファイルをその場で編集することを意味します。
grep
簡単な解決策は grep
( [〜#〜] gnu [〜#〜] または [〜#〜] bsd [〜 #〜] )コマンドは以下のとおりです。
空白行を削除します(スペースを含む行は含まれません)。
grep . file.txt
完全に空白の行(スペースを含む行を含む)を削除します。
grep "\S" file.txt
注:不要な色が表示された場合は、grep
がgrep --color=auto
のエイリアスであることを意味します(type grep
で確認)。その場合、--color=none
パラメータを追加するか、\grep
としてコマンドを実行するだけです(エイリアスは無視されます)。
ripgrep
ripgrep
と同様(はるかに大きなファイルに適しています)。
スペースを含む行を含まない空白行を削除します。
rg -N . file.txt
またはスペースを含む行を含める:
rg -N "\S" file.txt
以下も参照してください。
sed
の場合: sedを使用して空の行を削除awk
の場合: awkを使用して空白行を削除sed '/^$/d' file.txt
dは、行を削除するsedコマンドです。 ^$
は、空白行のみに一致する正規表現で、行の先頭に行の末尾が続きます。
Grepで-vオプションを使用して、一致する空の行を削除できます。
このような
grep -Ev "^$" file.txt
これがawk
ソリューションです:
awk NF file.txt
Awkでは、NF
は空白以外の行にのみ設定されます。この条件が一致すると、Awkのデフォルトのアクションは行全体を印刷することです。
空の行を削除するには、tr
で新しい行の繰り返しを絞り込みます。
cat file.txt | tr -s '\n' '\n'
先頭の空白を削除してもかまわない場合はxargs
$ docker run -it --rm Alpine sh
/ # cat <<eof > /tmp/file
> one
>
> two
> three
>
>
> four
> eof
/ # cat /tmp/file
one
two
three
four
/ # cat /tmp/file | xargs -n1
one
two
three
four
私にとって@ martigin-heemelsコマンドはエラーをスローしていましたが、これで修正されました(つまり、iへのダミーパラメータ)。
sed -i '' '/^$/d' file.txt
おそらく、空白行を削除する(スペースなしで)最も簡単な方法は、cat -s
を使用することです。
$ cat -s file
$ some-command | cat -s
少なくとも、ファイルをその場で編集したくない場合は、代わりにターミナルに書き込みます。また、それは面白い正規表現ビジネスを含まないので、REに不慣れな人でも覚えやすいです。
man cat
から:
-s, --squeeze-blank never more than one single blank line
OSによって異なる場合がありますが、前回確認したとき、いくつかのLinuxとOpenBSDに存在していました。
ex
editor (Vimの一部)を使用する方法は次のとおりです。
ex -s +'v/\S/d' -cwq test.txt
複数のファイルの場合(インプレース編集):
ex -s +'bufdo!v/\S/d' -cxa *.txt
注::bufdo
コマンドは [〜#〜] posix [〜#〜] ではありません。
ファイルを変更せずに(標準出力に出力するだけ):
cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin