grepで空白行を削除する


164

grep -v '^$'Linuxで試しましたが、うまくいきませんでした。このファイルは、Windowsファイルシステムからのものです。

回答:


300

以下を試してください:

grep -v -e '^$' foo.txt

この-eオプションを使用すると、正規表現パターンを照合できます。

一重引用符で囲む^$と、Cshellで機能します。他のシェルは一重引用符または二重引用符で満足します。

更新:これは、空白行または「すべての空白」(「\ r \ n」スタイルの行末を含むWindows行など)を含むファイルに対して私にとって機能しますが、上記は空白行とUNIXスタイルの行末を含むファイルのみを削除します。

grep -v -e '^[[:space:]]*$' foo.txt

そのegrepは、行にスペースが0個または1個のファイルに対してのみ機能し、2個以上のスペースを持つファイルには機能しません。変化する ?に*。
Ed Morton

4
これはである必要がgrep -E -vあります。その後-eはすべてパターンとして解釈されます。
jazzpi

6
grep -v -e '^[[:space:]]*$' -e '^#' fileスクリプトまたは構成ファイル(またはコメントにハッシュ文字を使用するファイルタイプ)のすべての非空白、非コメント行が表示されます。
palswim

「この-eオプションでは、一致する正規表現パターンが許可されます。」それは非常に誤解を招くものです。-eは(POSIX-)の定義ですThis can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).マニュアルから)。Grepは、デフォルトで(基本的な)正規表現をすでに想定しています。このパターンでは、-e完全に省略できますgrep -v '^[[:space:]]*$' foo.txt
イエティ

73

単純にする。

grep . filename.txt

1
これにより、ファイル内のすべての行が
取得さ

2
@LưuVĩnhPhúc空白行を除くファイル内のすべての行を出力します。
Frej Connolly 2017

2
これは、Linuxベースのシステムのファイルでは機能しますが、Windowsのファイルでは機能しません。おそらくWindowsの行末文字が原因です。

Windowsの行末でファイルを処理するというOPの問題は完全には解決しませんが、私はこれを支持していますが、私にはその問題がないため、これは私にとって完璧な解決策であることがわかりました。
デビッドZ

1
これは完璧なソリューションです。シンプルでLinuxで動作しました。
W00f

30

使用する:

$ dos2unix file
$ grep -v "^$" file

または単にawk:

awk 'NF' file

dos2unixがない場合は、trなどのツールを使用できます。

tr -d '\r' < "$file" > t ; mv t "$file"

プログラムdos2unixが見つかりません。それはWindows用ですか?askコマンドも機能しません。
ノード忍者

尋ねる?いいえ、それはawkです。
iconoclast 2014年

UNIXスタイルの行末に変換することの利点は、正規表現が期待どおりに機能しない可能性があることです。行末を変換するまで、ここでは何もうまくいきませんでした。
Ryan H.

16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

コードを実行する

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

これがどのように/なぜ機能するかについてさらに理解するには、正規表現を読むことをお勧めします。http://www.regular-expressions.info/tutorial.html


2
これはどのようにそしてなぜ機能するのですか?あなたが説明できればあなたの答えははるかに良いでしょう。たとえば、正規表現は、文字列の先頭、次にPOSIX標準を使用する1つ以上のスペース、次に文字列の末尾に一致します。つまり、grep -vを使用すると、スペースのみであるすべての行が削除されます。正しい?スペースがない場合はどうなりますか。それは単に改行文字ですか?
ベン

私の例が示すように、空の行だけが削除されます(最初の行)。もっと情報を追加したので、うまくいけば助かります。:)
Sepero

3

私はを使用することを好みegrepますが、空白行のある本物のファイルを使用したテストでは、アプローチは正常に機能しました(ただし、テストには引用符がありません)。これもうまくいきました:

egrep -v "^(\r?\n)?$" filename.txt

それを試しました。空白行がまだ表示されています。これは、ファイルがWindowsで作成されたためでしょうか?
ノード忍者

3

連続する複数の空白行のシーケンスがあり、シーケンスごとに1つの空白行だけが必要な場合は、

grep -v "unwantedThing" foo.txt | cat -s

cat -s 空の出力行の繰り返しを抑制します。

あなたの出力は

match1



match2

match1

match2

元の出力の3つの空白行は、1つの空白行に圧縮または「圧縮」されます。



2

前の回答と同じ:

grep -v -e '^$' foo.txt

ここで、grepのgrep -e拡張バージョンを意味しますます。'^ $'は、^(行の先頭)と$(行の終わり)の間に文字がないことを意味します。「^」と「$」は正規表現文字です。

したがって、コマンド grep -vはこのパターンに一致しないすべての行を出力します(^と$の間に文字はありません)。

これにより、空の空白行が削除されます。


-e「grepの拡張バージョン」という意味ではありません-E。マニュアルでは-e、パターンが続くことを明示的に述べているだけであることを明確に述べています。パターンはダッシュで始まっておらず、いずれにしても1つのパターンのみを定義しているので、デフォルトではgrepは1つの正規表現パターンを想定しているため、省略しておくこともできますgrep -v '^$' foo.txt(拡張正規表現機能は不要)。また、これはファイルの空白行を削除するのではなく、出力を介してパイプされる行のみを削除することにも言及する価値があります。その場合、sed -i適切なツールになります。
イエティ

1

私は一生懸命試しましたが、これはうまくいくよう\rです(ここであなたを噛んでいると仮定します):

printf "\r" | egrep -xv "[[:space:]]*"

これは、最初の部分をファイルからの出力で置き換えると機能します。
ノード忍者


0

egrep -v "^ \ s \ s +"

egrepはすでに正規表現を実行しており、\ sは空白です。

+は現在のパターンを複製します。

^は始めに


0

使用する:

grep pattern filename.txt | uniq

uniq隣接する空白行を1行だけに減らしますが、完全には削除しません。それでも、そのように使用するのがuniq好きです。最初にソートすると、すべての空白行が効果的に削除されます-1つだけ残されますが、行の順序を並べ替えることは受け入れられない場合があります。
ザックヤング

いい視点ね。これにより、繰り返し行が途切れます。私の解決策にはバグが含まれていると思います。
baitisj 2013年

0

白い線と#記号で始まる線を削除する別の方法を次に示します。これは設定ファイルを読むのにとても便利だと思います。

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

0

grep -v -e '^ $'を使用しても機能することは事実ですが、1つ以上のスペースを含む空白行は削除さません。空白行を削除する最も簡単で簡単な答えは、awkを使用することです。以下は、上記のawkの連中から少し変更したものです。

awk 'NF' foo.txt

しかし、この質問はgrepを使用するためのものなので、次のように答えます。

grep -v '^ *$' foo.txt

注意:^と*の間の空白スペース。

または、次のように\ sを使用して空白スペースを表すことができます。

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