sed は範囲内の行を削除します。

sed は範囲内の行を削除します。

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<=57FNRファイルごとの行番号です。一方、グローバル行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

関連情報