シェルスクリプト:特定の行からパターンに一致する2つの連続した行を削除したいです。

シェルスクリプト:特定の行からパターンに一致する2つの連続した行を削除したいです。

ファイル内の特定の行のパターンに一致する2つの連続した行を削除したいと思います。

たとえば、ファイルの内容は次のようになります。

Line1: a
Line2: b
Line3: c
Line4: Name: 123
Line5:  xyz
Line6: Name: 456
Line7:  abc

4行目から始まる行を探して、「名前:」で始まる最初の行のパターンと一致し、スペースで始まる2行目のパターンと一致し、2つの連続した行を削除したいと思います。

sedシェルや他の方法を使用してこれを行う効率的な方法はありますか?

より明確にするために、MANIFEST.MFから署名/チェックサム情報を削除したいと思います。

サンプル MANIFEST.MF は次のとおりです。以下のマニフェストファイルから「名前:」エントリを削除したいと思います。ここで、 "name:" エントリは 1 つまたは 2 つ (またはそれ以上) 行に存在できます。

最初に私の解決策は、最初の「名前:」エントリを見つけて、「SHA-256-Digest:」エントリを見つけてファイルの最後まで削除するのと同じでした。残念ながら、このソリューションには途中で必須項目を削除する問題があります。たとえば、「NetBeans-Simply-Convertible:」も削除されます。

これで、1行に使用可能な「名前:」項目または2つ以上の行にまたがる項目を削除したいと思います。ただし、「名前:」エントリを削除すると、「NetBeans-Simply-Convertible:」などのエントリが失われてはいけません。

次のコマンドを使用して、ファイルから「SHA-256-Digest:」エントリを削除しました。sed -i "/^\SHA-256-Digest: /d" $manifest_file


Manifest-Version: 1.0
Version-Info: ....

Name: com/abc/xyz/pqr/client/relationship/message/notifier/Relati
 onshipUpdateNotifierFactory.class
SHA-256-Digest: cSSyk6Y2L2F9N6FPtswUkxjF2kelMkGe4bFprcQ+3uY=

Name: com/abc/xyz/pqr/client/relationship/ui/BaseRelationshipView
 $5.class
SHA-256-Digest: w9HgRjDuP024U4CyxeKPYFe6rzuzxZF3b+9LVG36XP8=

Name: com/abc/xyz/pqr/client/impl/MofRelationshipAgentImpl.class
SHA-256-Digest: GwIBIU+UdPtjyRhayAVM90Eo+SwCT/kP65dI59adEnM=

Name: com/abc/xyz/pqr/client/settings/ConvertibleProperties.class
NetBeans-Simply-Convertible: {com/abc/xyz/pqr/client/settings}Con
 vertibleProperties
SHA-256-Digest: 5FszAtfpPXcLx/6FBWbfeg6E4fwFMRozV+Q+3rReATc= ...

予想出力:

Manifest-Version: 1.0
Version-Info: ....


NetBeans-Simply-Convertible: {com/abc/xyz/pqr/client/settings}Con
 vertibleProperties

...

ベストアンサー1

アッ方法:

次のような入力ファイルがあるとしますfile.txt(各行にLine<number>:最初のフィールドが含まれているとします)。

Line1: a
Line2: b
Line3: c
Line4: Name: 123
Line5:  xyz
Line6: Name: 456
Line7:  abc
Line8: Name: 111
Line9: www
Line10: Num: 222
Line11:  abc
Line12: Name: 333
Line13:  ccc

awk '{ if ($2 == "Name:") { 
           if ((getline l) > 0){ 
               if (l ~ /^\S+  \S+/) { next } else { print $0 RS l }               
           }
       } else { print } 
}' file.txt

出力:

Line1: a
Line2: b
Line3: c
Line8: Name: 111
Line9: www
Line10: Num: 222
Line11:  abc

「ライン変数の取得」– awk 入力から次のレコードを変数として読み込みます。var

これ並ぶコマンドがレコードを見つけた場合は1を返し、ファイルの終わりを見つけた場合は0を返します。

おすすめ記事