web-dev-qa-db-ja.com

Sedを使って空の行を削除する

Sedを使って空の行を削除しようとしています。

sed '/^$/d'

しかし、私は運が悪いです。

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

xxxxxx


yyyyyy


zzzzzz

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

xxxxxx
yyyyyy
zzzzzz

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

292
jonas

あなたの "空の"行にスペースやタブがあるかもしれません。空白だけを含むすべての行を削除するには、 POSIXクラスsedとともに使用します。

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

例えばgnu sedでEREを使う短いバージョン:

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

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

549
Kent

awkソリューションが足りません。

awk 'NF' file

どちらが返されます:

xxxxxx
yyyyyy
zzzzzz

これはどのように作動しますか? NFは "フィールド数"を表しているので、空の行は0項目を持ち、awkは0をFalseと評価し、行は表示されません。しかし、少なくとも1つのフィールドがある場合、評価はTrueとなり、awkにデフォルトのアクションを実行させます。現在の行を表示します。

68
fedorqui

sed '/^$/d'は問題ないはずです、あなたはその場でファイルを修正することを期待していますか?もしそうなら、あなたは-iフラグを使うべきです。

txtfilesから空の行を削除し、行頭と行末からスペースを削除します 私はあなたが達成しようとしていることだと思います。

52
30
Oleg Mazko

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

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
28
Vadim

承認された回答 ここ および上記の承認された回答の助けを借りて、私は次のものを使用しました。

$ 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に賞賛

13
ConMan

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

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

テキストファイルはWindows上で作成されているため、予期しない動作が発生する可能性があります。したがって、行末シーケンスは\r\nです。 sedまたはuseを実行する前にdos2unixを使用してUNIX形式のテキストファイルに変換できます。

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

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

2
FauChristian

"grep"を使って、そのようなことをすることもできます。

egrep -v "^$" file.txt
2
Lowbit

これはawkでも同様に機能します。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
2
Claes Wikner

私のbash特有の答えは、次のようにPerl置換演算子をグローバルパターンg flagと一緒に使用することを推奨することです。

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

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

ちなみに、OPの元のコードsed '/^$/d' $fileは、高性能スーパーコンピューティングクラスタのmacOS High SierraおよびCentOS 6/7 Linux上のbashターミナルでうまく動作します。

0
justincbagley