以下を使用して、ファイルの末尾にある空白行をすべて削除したいと思います。awk
次のコマンドを使用して、上部の空白行をすべて削除する方法を正常に見つけることができました。
awk '/^$/ && a!=1 {a=0} !/^$/ {a=1} a==1 {print}' file.txt
しかし、結論を取り除くために反転する方法がわかりません。上記のコマンドを使用してパイプで接続できることはわかっていますが、可能であればtac
コマンドを使用する直接的なアプローチを好みます。awk
明確にすると、「視覚的に空の」行、つまり最大スペースおよび/またはタブを含む行は「空」と見なされます。
ベストアンサー1
アッ
awkは外部の助け(例えばTac)なしで最初の行から最後の行まで順番にファイルを読み取るので、実際にファイルの終わりに達したときに空の行ブロックがファイルの終わりにあるかどうかだけを知ることができます。
あなたができることは、空行(改行文字、基本レコード区切り文字などRS
)を持つ変数を保持し、空でない行に達したら空白行を印刷することです。
awk '/^$/{n=n RS}; /./{printf "%s",n; n=""; print}' file
print n
なぜとの間に違いがあるのか理解できませんprintf n
。
print
出力レコード区切り記号の追加(ORS
、デフォルトは改行)を印刷する式に設定します。したがって、試してみると、追加の改行文字が得られます。次のように単一の出力ステートメントを使用して作成することもできます。
awk '/^$/{n=n RS}; /./{printf "%s%s%s",n,$0,RS; n=""}' file
エドまたは前任者
出力を印刷するには(Awkと同様)、次のいずれかのオプションを選択します。
printf '%s\n' 'a' '' '.' '?.?+1,$d' ',p' 'Q' | ed -s file
printf '%s\n' 'a' '' '.' '?.?+1,$d' '%p' 'q!' | ex -s file
変更をファイルに直接適用するには、次のいずれかのオプションを選択します。
printf '%s\n' 'a' '' '.' '?.?+1,$d' 'w' 'q' | ed -s file
printf '%s\n' 'a' '' '.' '?.?+1,$d' 'x' | ex -s file
コマンドの置き換え
シェルはコマンド置換から末尾の改行を削除します。
printf '%s\n' "$(cat file)"
一部のシェルは大容量ファイルを処理できず、「引数リストが多すぎる」エラーが発生します。
からインスピレーションを受けるこの回答。