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


61

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

1
awkについては、「awkの空白行を削除する」または「grepを使用する」を
ケノーブ


1
これはかなりのgrep、sedは、awkをを使用して、すべての可能な解決策を提供します叙事詩の答えです:stackoverflow.com/questions/16414410/...
wisbucky

回答:


87

このsed行はトリックを行う必要があります。

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

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


13
スペースのみを含む行を削除するには、実際には「/ ^ * $ / d」である必要があります。
ショーンレイフシュナイダー

2
@SeanReifschneiderこの答えが書かれたとき、その要件は問題にありませんでしたか?
カスペルド

4
@SeanReifschneider「/ ^ \ s * $ / d」はタブが含まれるので、良くないでしょうか?元の投稿では言及されていませんが、私にとってはより強力な選択肢のようです。
mrswadge


私が取得bad flag in substitute command: 'e'
ishandutta2007

29

grep

簡単な解決策は、以下のようにgrepGNUまたは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

こちらもご覧ください:


2
grep .最も簡単な解決策のようです。
レオ

grep .他のソリューションと比較した場合の欠点は、すべてのテキストが赤で強調表示されることです。他のソリューションは元の色を保持できます。比較unbuffer apt search foo | grep .unbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky システム上grepでエイリアスさgrep --color=autoれているため、色が表示されます(チェック:)type grep。として実行する\grepか、--color=noneパラメータを使用できます。
ケノーブ

@kenorbを使用grep --color=none .すると、すべての白いテキストが取得され、元のコマンドの色の書式設定が上書きされます(例:apt search foo
wisbucky

grep .OPは望ましくないと言っているスペースのみを含む行に一致します。
ジムL.


22

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

このような

grep -Ev "^$" file.txt

4
-E少なくともGNU grepでは必要ではないと思いますが、それを除けば、これがgrepで行われることを嬉しく思います!それは毎回sedを優先して到達するものです。インラインフィルターは、インラインエディターよりも優れているように思えます。
マッドハッター

あなたが特にconfにファイルを扱う一方で、コメントと空白行をスキップする場合に使用grep -Ev '^#|^$' file.txt
Govindカイラス

7

ここでawk解決策は:

awk NF file.txt

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


6

空の行を削除するには、次のようにして新しい行の繰り返しを絞ることができますtr

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

これにより、OPが要求した4行ではなく、6行が生成されます。
ケノーブ

1

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

0

Ex / Vim

exエディター(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

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.