sedを使用して空の行を削除する


350

私はsedを使用して空の行を削除しようとしています:

sed '/^$/d'

しかし、私はそれで運がありません。

たとえば、次の行があります。

xxxxxx


yyyyyy


zzzzzz

そして私はそれが次のようになりたいです:

xxxxxx
yyyyyy
zzzzzz

このためのコードは何ですか?


2
あなたのsedコマンドはうまく見えます、それはうまくいくはずです
perreal

上記のコマンドは、スペース/タブがなくてもCR + LFの行末がある場合でも機能しません。
devnull 2013年

回答:


628

「空」の行にスペースまたはタブが含まれている可能性があります。POSIXクラスを使用しsedて、空白のみを含むすべての行を削除します。

sed '/^[[:space:]]*$/d'

EGNを使用する短いバージョン(たとえば、gnu sed):

sed -r '/^\s*$/d'

(sedはPCREをサポートしていないことに注意してください。)


3
@HuStmpHrrr gnu sedはPCREをまったくサポートしていません。それはEREです-r
ケント

8
OS Xには、必要に応じてsed -i "" '/^[[:space:]]*$/d' <filename>
JWW

@BernieReiter ^\s*$は、すべての「空の」行に一致します。ここで空とは、行に文字が含まれていないか、行に空の文字列(たとえばスペース)のみが含まれていることを意味します。一致するすべての行は、sedのdコマンドで削除されます。
ケント

96

私にはawk解決策がありません:

awk 'NF' file

どちらが返されますか:

xxxxxx
yyyyyy
zzzzzz

これはどのように作動しますか?NF「フィールド数」を表すので、空の行にはフィールドが0になるため、awkは0を偽と評価し、行は出力されません。ただし、少なくとも1つのフィールドがある場合、評価はTrueになりawk、デフォルトのアクションである現在の行を出力します。


1
ああ。BSDの「最小化」バージョンのawk(バージョン20121220(FreeBSD)でも動作します。ありがとう:-)
Bernie Reiter

@BernieReiterどういたしまして:)はい、これはすべてのawkバージョンで許可されている非常に基本的な慣用的なものです。
fedorqui 'SO stop harming'

そして、それは非常に速いです-迅速で汚いテストのために-私はawkを2回呼び出してい$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s ます: これをawkスクリプトに含めるための気の利いた方法、例えばパターンなどを知っていますか?awk '/ mypattern / {do stuff ...}'
Bernie Reiter

@BernieReiterあなたは言うことができますawk 'NF {do stuff...}'
fedorqui 'SO stop harming'

1
これは空白のみの行も無視することに注意してください。
wisbucky

60

sed '/^$/d'大丈夫なはずですが、ファイルを適切に変更することを期待していますか?その場合は、-iフラグを使用する必要があります。

おそらくそれらの行は空ではないかもしれません。その場合は、この質問を見てください。txtfilesから空の行を削除し、行の先頭と末尾からスペースを削除してください私はあなたが達成しようとしていることだと思います。


はい。ファイルを変更しています。* .csv。-iをsedコマンドにどのように配置する必要がありますか?
jonas 2013年

2
sed -i '/^$/d'それを行う1つの方法です。
Alberto Zaccagni 2013年

49

1
これらのオンラインツールで正しく表示が、[]必要がありません、ここでコードが正しくないですので、ブラケット表現にエスケープする\[\[:space:\]\]\[ \t\]-であるべき[[:space:]][ \t]
ベンジャミンW.

1
@BenjaminW。それをキャッチしてくれてありがとう。それらは原作者からのものではなく、通常のテキストから「コード」に変更されたときにEdit 3から来たもので、「\」エスケープを「公開」しました。私はそれらを修正しました。
wisbucky

30

これが最も簡単で最速の方法だと思います。

cat file.txt | grep .

すべての空白行も無視する必要がある場合は、次のことを試してください。

cat file.txt | grep '\S'

例:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

出力

7
5

5
不要catgrepファイルもgrep . file.txt
取得

3
はい、わかっていますが、最初の質問では、ソースがファイルなのかそれ以外なのかについては触れられていなかったので、解決策は "|"の後にあり、その前にあるのは単なるソースの例です。ソリューションをラインのソースから区別するだけです。
Vadim

2
grep '\S'絶対にポータブルではありません。持っているgrep -P場合は使用できますgrep -P '\S'が、すべてのプラットフォームでサポートされているわけではありません。
Tripleee 2017年

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

15

ここで受け入れられた答えと上記の受け入れ られた答えの助けを借りて、私は使用しました:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

これはすべてのベースをカバーし、私のニーズに完全に対応します。元のポスター@Kentと@kevへの称賛


5

あなたは言うことができます:

sed -n '/ / p' filename    #there is a space between '//'

..これはprint all lines except the empty one(s)、静かであることを意味します
ティモ



2

テキストファイルがWindowsで作成されたため、予期しない動作が発生している可能性が高いため、行末は\r\nです。sedを実行する前にdos2unixを使用してUNIXスタイルのテキストファイルに変換するか、

sed -r "/^\r?$/d"

改行があるかどうかにかかわらず、空白行を削除します。


こんにちは、-rフラグは何をしているのですか、それを組み合わせて-iファイルを直接変更し、画面に印刷されないようにすることは可能ですか?さらに、このコマンドは次のようにも機能すると思いますsed -r "/^\r$/d"
Alexander Cska

2

別のオプションなしsedawkperl、など

strings $file > $output

strings-ファイル内の印刷可能な文字列を印刷します。


あなたは意味するかstringsの代わりにstring
ミカエルB.

こんにちは@MickaelB。あなたは正しい、私はそれを修正します。
user319660

0

bash固有の答えは、次のように、このためperlのグローバルパターンgフラグで置換演算子を使用することを推奨することです。

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

この回答は、空の行にスペースが含まれているかどうかの説明([\ ]*)と、|複数の検索語/フィールドを区切るための使用を示しています。macOS High SierraおよびCentOS 6/7でテスト済み。

FYI、OPの元のコードは、sed '/^$/d' $file中だけで正常に動作しbash、高性能スーパーコンピューティングクラスタでのMacOSハイシエラとCentOSの6/7 Linux上でターミナルを。


-3

FreeBSD 10.1とsedを使用している私にとっては、このソリューションのみが機能しました:

sed -e '/^[     ]*$/d' "testfile"

内部[]にはスペースとタブ記号があります。

テストファイルに含まれるもの:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

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