sedは「二重」改行文字を削除できますか?


25

空の行が多いドキュメントがあります。

一緒に2つ以上ある場合、どうすれば削除できますか。

sed "s/\n\n//"ファイルを試しましたが、うまくいきませんでした。エラーなし。


3
すべての空白行を削除するのではなく、2行以上の場合にのみ、正しく読み上げますか。単一の空白行ではないのですか?
ルニウム

1
そして、それが2行以上の場合、本当にそれらのすべてが削除されるか、1つを除くすべてが削除されますか?
ハウケレイジング

回答:


42

空の行を削除するだけです:

sed  '/^$/d'

sedは行指向であるため、そのバイトが改行である場合を除き、「特定のバイトが2つ以上」という観点から考えるとうまくいきます。次に、ライン全体で機能する何かを考える必要があります。


もちろん!+1シンプルなエレガンス。
テルドン

2
sed「パターンスペース」/「ホールドスペース」機能を介して複数の行を処理できます。しかし、私はそれが複雑すぎると感じています。;-)
Hauke Laging

ファイルの最初の文字が改行の場合、これは期待どおりに機能しません。
クリスダウン

1
最初の文字が改行の場合に機能させるには(実際に必要な場合)、コマンドを負のアドレスで囲むことができます1!(1行目を除くすべてに一致)sed '1!{/^$/d'}
トビー

1
@AaronFranke-はい。しかし、それはLinuxシェルが「>」リダイレクトをどのように扱うかの側面です。シェルはコマンドラインを調べ、stdoutからファイルへの '>'リダイレクトを確認し、そのファイルを作成してから実行しsedます。ファイルを作成すると、基本的に同じ名前の既存のファイルが削除されます。 sed '/^&/d' file.txt > otherfile.txt働くでしょう。
ブルースエディガー

24

の必要はありませんsedgrepしましょう:

grep .

(つまりgrep、SPC、ドット、少なくとも1文字を含む任意の行に一致します)。

またあります:

tr -s '\n'

(改行文字のシーケンスを1つに絞り込みます)。

クリスが述べたように、空の行を削除することは上記の最初の解決策や他のほとんどの回答がここに焦点を当てているため)最初の行が空の場合に要求される改行文字のシーケンスを絞ることと同じではないため、両方は同等ではありません最初の行を空にするために先頭の改行文字を1つだけ使用します。


2
これは、ファイルの最初の文字が改行の場合、期待どおりに機能しません。sprunge.us
クリスダウン

7

sedこれは最適なツールではありません。これは行ベースであり\n、行末文字として処理されるため、複雑になります。@Bruce Edigerの答え を見たsedことは、仕事に最適なツールかもしれませんが、他にもいくつかのオプションがあります。

  1. Perl

    perl -ne 'print if /./' file.txt
    

    または

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

    これを読んでくれた@ruakhに感謝します。

    $ /

    入力レコード区切り文字。デフォルトでは改行。これは、「ライン」とは何かというPerlの考え方に影響を与えます。null文字列に設定されている場合、空行をターミネータとして扱うなど、awkのRS変数のように機能します(空行にはスペースやタブを含めることはできません)。複数文字の文字列に設定して、複数文字のターミネータに一致させるか、undefに設定してファイルの最後まで読み込めます。ファイルに連続した空行が含まれている場合、「\ n \ n」に設定すると、「」に設定した場合とは少し異なることを意味します。「」に設定すると、2つ以上の連続した空行が単一の空行として扱われます。「\ n \ n」に設定すると、改行であっても、次の入力文字が次の段落に属すると盲目的に想定されます。

  2. gawk / awk

    awk '$1' file.txt
    

    これは投稿された例では機能しますが、@ Stephane Chazelasが指摘したように、最初のフィールドが " likes "である行も削除し0ます。これはより堅牢です。

    awk NF file.txt
    

Perlの場合perl -pe 's/\n+/\n/ file.txtは、入力レコードの区切り文字はこの使用には無関係です。
フォンブランド

@vonbrandがない、perl -peまたはperl -neラインによって作業ライン。\n+1行にのみ適用されるため、一致しません。そのため、設定$/または使用する必要があります-0、ファイル全体をti slurpにますperl -0pe 's/\n+/\n/' file
テルドン

6

削除とはどういう意味ですか?重複を削除する(1つに多くの空白行)またはすべて削除しますか?

重複を削除する場合、sedを使用する方法は次のとおりです。

sed '$!N; /^\(.*\)\n\1$/!P; D'

uniqコマンドをシミュレートします。

最良の選択は以下を使用することawkです:

awk NF <filename>

このsed部分は素晴らしい作品です!これをベストアンサーとして推奨します。
アキト

2

これらの回答のほとんどでは、最初に末尾の空白を削除する必要があります。二重化された改行を削除すると、すべての空白行が削除されます。(これについて考えます)。

文字通り、OPは「繰り返し空白行がある場合、ファイルからすべての空白行を削除する」ことを望んでいると解釈しました。

一般的なユーザーは、「重複する空白行のみを削除する」ことを望みます。

これを行うには、最初に末尾のホワイトペースを取り除き、cat -sでパイプします。

sed  s/[[:space:]]*$// | cat -s

それでも、これはスーパーフロースの先頭または末尾の空白行を削除しません。


ダウンボットですが、これは明らかに機能しますか?コメント無し ?
mckenzm

1
私はあなたを...賛成しました...質問に答えました。=)Bruce Edigerの応答がすべての空白行を削除するときに支持されたとは信じられません。誰かが重複した空白行を削除する方法を尋ねた場合、すべての空白行を削除することが受け入れられる解決策となるシナリオは想像できません。しかし、何でも。ところで
トッドウォルトン

2

空白行の特定のシーケンスに対して単一の空白行を保持する場合は、次のようにします。

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'

1
これは、cat -s私が理解しているように質問が尋ねたものを正確に達成する唯一の答えです。(そしてcat -s、私はsed -iそれを使うことができるからです。)
マシュー

-2

フィールドの区切り文字と正規表現の一部の両方を問題としてsed -e 's#\\n\\n#\\n#g' input.file > output.file使用してみてください/


2
シーケンス内に二重改行と三重改行を含むファイルの1つでこれを旋回させました。私にはまったく機能しません。
構文エラー

-3

次のコマンドを使用します。

tr -s '\r' '\n'

はい、彼らの答えは私にはうまくいきませんでした。
ニャー

5
私の知る限り、この答えは間違っています。削除することをお勧めします。
-zuazo

ああ、これは私のファイルに実際にたくさんの改行と改行が含まれているからです。0x0d0a-
ニャー

2
実際、このコマンドは、ウィンドウの行末で繰り返し行を削除します。でテストしecho -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'ます。このコマンドtrは、すべてを1つに変換して\rから\n、すべて\nを1つに絞り込みます。したがって、これは機能しますが、これはUNIXではなくウィンドウに適用されるという事実をどうすればよいのかわかりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.