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/./
:正規表現に一致しないすべての行を選択します.
(たとえば、すべての空行を選択します)。彼らと次のことを行います。.,/./-1j
:j
oinコマンドは、選択した行(.
)から上の空でない次の行()までの行に適用されます/./-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
コマンドは編集バッファの内容を の出力に置き換えsomecommand
、uniq
指定されたファイルから繰り返される連続行を削除します。コマンドは%
現在のファイルの名前に置き換えられます。初期仮定に基づいて繰り返される連続空行を削除することで問題を解決します。