web-dev-qa-db-ja.com

ファイルの最初と最後から空の行を削除するにはどうすればよいですか?

ファイルの最初と最後から空行を削除したいが、行間の空行は削除したくない。 sedまたはawkが解決策になると思います。

ソース:

1:
2:
3:line1
4:
5:line2
6:
7:
8:

出力:

1:line1
2:
3:line2
10
Feriman

これを試して、

ファイルの先頭から空白行を削除するには:

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はコマンドを処理せずに終了します。

5
Stack EG

この小さな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)"
7
glenn jackman

私はこれを提案します:

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
5

ファイルがメモリ要件を満たすのに十分小さい場合:

$ Perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1

line2
  • -0777入力ファイル全体を丸める
  • ^\n+文字列の先頭から1つ以上の改行
  • \n\K空でない最後の行の改行文字を削除しないようにする
  • \n+$文字列の最後に1つ以上の改行
5
Sundeep

完全を期すための単純な2パスアプローチ:

$ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
line1

line2

上記は空白文字のみの行を空として扱います。代わりに、文字をまったく含まない行のみを空と見なしたい場合は、NF/./に変更します。

1
Ed Morton

コードは書かれていませんが、これらの行に沿って任意のサイズのファイルに対して効率的なアルゴリズムが必要です。

(a)最初の空でない行まで空の行を読み取り、無視します。

(b)次の空になるまで空でない行を読み取って印刷します。

(c)次の非空になるまで空行を数える(n)。

(d)空ではない場合、n行改行して印刷すると、状態(b)に戻ります。

(e)EOFを押すと、完了です。EOFの前に空のn行が破棄されます。

0
Paul_Pedant