XMLファイルがあります。行範囲から空の行のみを削除しようとしています。この例では、55-57行を確認し、空の行をすべて削除したいと思います。
これはすべてxmlの複数のファイルを介してシェルスクリプトで実行する必要があります。これはRHEL 7システムです。
を使ってみましたsed
が、空行を削除できませんでした。
適切な行番号を取得するためにステートメントを作成し、これをシェルスクリプトにvars(start_line
、、finish_line
)として保存しました。
サンプルファイル:
1.
2.
3. <Test></Test>
.
.
.
55.
56.
57.<!-- keep the comment -->
58. <KeepTag></KeepTag>
55から57の範囲の空行のみを削除する方法は?
答え1
あなたはこれを簡単に行うことができますアッ:
awk 'FNR>=55 && FNR<=57 && NF==0{next}1' file
awk
これは、「基本プログラム本文」(つまり、外部ルール固有のコード入力)のaが、「規則によって行われたすべての修正を含む現在の行を印刷する」という意味の一般的な略称表記を使用します。1
{ ... }
ただし、print
次のコマンドを実行してnext
それをバイパスします。もし以下の規格が適用されます。
行番号は55から57の間です(条件:
FNR>=55 && FNR<=57
はFNR
ファイルごとの行番号です。一方、グローバル行NR
番号は、単一の呼び出しawk
で複数のファイルを処理するために使用される場合に変更される可能性があります。異なります!)そして
行には、で表されるテキストはなく、
NF
コンテンツフィールドの数は0です。
この「バイパス」によってawk
生成された出力は、指定された行範囲内にある場合は空行を除外します。
答え2
sedを使用すると、アドレス範囲を使用してこれを実行できます。
sed '55,57{/^$/d}' file
これにより、55行と57行(55,57)の間に選択された空の行(/ ^ $ /)にdコマンド(削除)が適用されます。テストすることはできませんが、macOSではdコマンドの後に「;」を追加する必要があるようです。
使用
sed -i '55,57{/^$/d;}' file
ファイルをローカルで変更したい場合
答え3
そしてsed
:
start_line=55
finish_line=57
sed "$start_line","$finish_line"'{/^$/d;}' file