ファイルの最初と最後から空行を削除したいが、行間の空行は削除したくない。 sed
またはawk
が解決策になると思います。
ソース:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
出力:
1:line1
2:
3:line2
これを試して、
ファイルの先頭から空白行を削除するには:
sed -i '/./,$!d' filename
ファイルの最後から空白行を削除するには:
sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
ファイルの最初と最後から空白行を削除するには:
sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
男からsed、
-e script、--expression = script->実行するコマンドにスクリプトを追加します
bラベル->ラベルを付けるブランチ。ラベルが省略されている場合、スクリプトの最後に分岐します。
a->行の後にテキストを追加します(代替構文)。
$->最後の行と一致します。
n N->パターンスペースに改行を追加してから、次の入力行をパターンスペースに追加します。入力がない場合、sedはコマンドを処理せずに終了します。
この小さなawkプログラムは、ファイルのstartで空行を削除します。
awk 'NF {p=1} p'
したがって、これをtac
と組み合わせて、行を逆にして取得できます。
awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
line1
line2
盗み @ guillermo chamorro's コマンド置換トリック:
awk 'NF {p=1} p' <<< "$(< file)"
私はこれを提案します:
printf '%s\n' "$(cat file)" | sed '/[a-z]/,$!d'
空白行の最初と最後を除いて、テキスト全体を印刷します。したがって、例を拡張すると:
(blank)
(blank)
line1
line2
line1
line2
line1
line2
line1
line2
(blank)
(blank)
それは出力します:
line1
line2
line1
line2
line1
line2
line1
line2
ファイルがメモリ要件を満たすのに十分小さい場合:
$ Perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1
line2
-0777
入力ファイル全体を丸める^\n+
文字列の先頭から1つ以上の改行\n\K
空でない最後の行の改行文字を削除しないようにする\n+$
文字列の最後に1つ以上の改行完全を期すための単純な2パスアプローチ:
$ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
line1
line2
上記は空白文字のみの行を空として扱います。代わりに、文字をまったく含まない行のみを空と見なしたい場合は、NF
を/./
に変更します。
コードは書かれていませんが、これらの行に沿って任意のサイズのファイルに対して効率的なアルゴリズムが必要です。
(a)最初の空でない行まで空の行を読み取り、無視します。
(b)次の空になるまで空でない行を読み取って印刷します。
(c)次の非空になるまで空行を数える(n)。
(d)空ではない場合、n行改行して印刷すると、状態(b)に戻ります。
(e)EOFを押すと、完了です。EOFの前に空のn行が破棄されます。