Edで2つ以上の空行を1つの空行に置き換える方法は?

Edで2つ以上の空行を1つの空行に置き換える方法は?

Edでは、次のようにすべての空白行を置き換える検索を実行できます。

g/^$/d

これにより、すべての空白行が削除されます。しかし、2つ以上の空の行を削除して1を維持するにはどうすればよいですか?たとえば、

Line 1


Line 2



Line 3

になる:

Line 1

Line 2

Line 3

答え1

から適応ビームウィキ:

ed -s file <<EOF
v/./.,/./-1j
w
q
EOF
  • v/./:正規表現に一致しないすべての行を選択します.(たとえば、すべての空行を選択します)。彼らと次のことを行います。
    • .,/./-1jjoinコマンドは、選択した行(.)から上の空でない次の行()までの行に適用されます/./-1
  • w q:保存と終了。これにより、%p Qファイルを変更せずに出力のみを表示できます。

同様に有効ですが、元の提案はより複雑でした。

printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file

このコマンドは、2つのコマンドを使用して単一のグローバルgコマンドを表します(通常、コマンドリストは単一のコマンドで構成されています)。コマンドリストで改行の前にバックスラッシュを付ける必要があります。

  • g/^$/:空白行をすべて選択します。
    • .,/./-1d\d選択した行()から.空でない次の行()の上の行を削除します/./-1。これにより空白行がすべて削除されるため
    • 'i\' ''i上に新しい空白行を挿入します。

使用するのと同じここのドキュメントまたは、Edに餌を与えるためにPrintfを使用してください。好きなものを選択してください。

引用:POSIXバージョン

答え2

外部コマンドを使用することは完全に有効な編集方法でありed、空でないすべての行が周囲の行と比較して一意であると仮定して(重複しないなど)、uniq余分な空行を削除するように呼び出すことができます。

w
e !uniq %

作業内容はディスク上の現在のファイルから読み取られるため、wまず作業を保存する必要があります。uniqこのe !somecommandコマンドは編集バッファの内容を の出力に置き換えsomecommanduniq指定されたファイルから繰り返される連続行を削除します。コマンドは%現在のファイルの名前に置き換えられます。初期仮定に基づいて繰り返される連続空行を削除することで問題を解決します。

関連情報