ファイルから複数の空行を削除する方法は?

ファイルから複数の空行を削除する方法は?

メモに使用するテキストファイルがあります。プレーンテキストのみを使用し、一般的にcat >> file。各セッションの終わりに、通常はCtrl+でファイルを閉じる前に、セッションを区切るためにD多数の空白行(Enter)を追加します(5-10)。

これは明らかにそれほどスマートではありませんが、私にとっては効果的です。私するしかし、不要な空白行がたくさんあるので、私は余分な行(ほとんど)を削除する方法を探しています。複数のオプションで直接使用できるLinuxコマンド(切り取り、貼り付け、grep...?)はありますか?または、私が望むことを達成するためにsed、awk、またはperl(実際にはsedまたはawkを好むがすべてのスクリプト言語で利用可能)スクリプトを知っている人はいますか? C ++で何かを書くこと(実際には自分でできること)があまりにも過度だと思いました。

状況#1:私に必要なのは、2つ以上の連続した空行を削除し、それを2つの空行に置き換えることができるスクリプト/コマンドです。ただし、1つ以上の行(2つ以上)を削除したり、複数の空白行を1つに置き換えたりする場合にも適用できると思います。

ケース#2:スクリプト/コマンドを使用して削除することもできます。一つ2行のテキストの間に空白行がありますが、複数の空白行が残ります(そのうちの1つを削除することも許可されています)。

答え1

ケース1:

awk '!NF {if (++n <= 2) print; next}; {n=0;print}'

ケース2:

awk '!NF {s = s $0 "\n"; n++; next}
     {if (n>1) printf "%s", s; n=0; s=""; print}
     END {if (n>1) printf "%s", s}'

答え2

複数の空行インスタンスを1つの空行に縮小することはできますがuniq、テキストを含む行が同じで互いに下にある場合は折りたたむこともできます。

答え3

ケース1:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'

ケース2:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '

答え4

次のようなアントン「uniq」を使用することをお勧めします...

先行、末尾、繰り返しの空行を削除します。

# Get large random string.
rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done

# Add extra lines at beginning and end of stdin.
(echo $rand_str; cat; echo $rand_str) |

# Convert empty lines to random strings.
sed "s/^$/$rand_str/" |

# Remove duplicate lines.
uniq |

# Remove first and last line.
sed '1d;$d' |

# Convert random strings to empty lines.
sed "s/$rand_str//"

長いリストから:

(rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done; (echo $rand_str; cat; echo $rand_str) | sed "s/^$/$rand_str/" | uniq | sed '1d;$d' | sed "s/$rand_str//")

または単に "cat -s"を使用してください。

維持するために括弧から中括弧に変更しました。現在のシェルコンテキストで私はこれがより効率的だと思います。中括弧には、最後のコマンドの後にセミコロンが必要で、それを区切るためのスペースが必要です。

# Add extra blank lines at beginning and end.
# These will be removed in final step.
{ echo; cat; echo; } |

# Replace multiple blank lines with a single blank line.
cat -s |

# Remove first and last line.
sed '1d;$d'

一行に。

{ { echo; cat; echo; } | cat -s | sed '1d;$d'; }

関連情報