web-dev-qa-db-ja.com

Unix(スペースを含む)でファイルから空/空白行を削除する方法は?

コマンドラインを使用して、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
75

次のsed行でうまくいくはずです。

sed -i '/^$/d' file.txt

-iは、ファイルをその場で編集することを意味します。

104
Martijn Heemels

grep

簡単な解決策は grep[〜#〜] gnu [〜#〜] または [〜#〜] bsd [〜 #〜] )コマンドは以下のとおりです。

  • 空白行を削除します(スペースを含む行は含まれません)。

    grep . file.txt
    
  • 完全に空白の行(スペースを含む行を含む)を削除します。

    grep "\S" file.txt
    

注:不要な色が表示された場合は、grepgrep --color=autoのエイリアスであることを意味します(type grepで確認)。その場合、--color=noneパラメータを追加するか、\grepとしてコマンドを実行するだけです(エイリアスは無視されます)。


ripgrep

ripgrep と同様(はるかに大きなファイルに適しています)。

スペースを含む行を含まない空白行を削除します。

rg -N . file.txt

またはスペースを含む行を含める:

rg -N "\S" file.txt

以下も参照してください。

42
kenorb
sed '/^$/d' file.txt

dは、行を削除するsedコマンドです。 ^$は、空白行のみに一致する正規表現で、行の先頭に行の末尾が続きます。

28
Kamil Kisiel

Grepで-vオプションを使用して、一致する空の行を削除できます。

このような

grep -Ev "^$" file.txt
22
jdabney

これがawkソリューションです:

awk NF file.txt

Awkでは、NFは空白以外の行にのみ設定されます。この条件が一致すると、Awkのデフォルトのアクションは行全体を印刷することです。

8
Steven Penny

空の行を削除するには、trで新しい行の繰り返しを絞り込みます。

cat file.txt | tr -s '\n' '\n'
7
siddhadev

先頭の空白を削除してもかまわない場合は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
1

私にとって@ martigin-heemelsコマンドはエラーをスローしていましたが、これで修正されました(つまり、iへのダミーパラメータ)。

sed -i '' '/^$/d' file.txt

0
ishandutta2007

おそらく、空白行を削除する(スペースなしで)最も簡単な方法は、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に存在していました。

0
kyrill

Ex/Vim

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
0
kenorb