シェルスクリプト:特定の行からパターンに一致する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を返します。

答え2

あなたの質問は明確ではないようです。 1つの答えは4行を削除します(一致する2行と次の2行はすべてを削除します)。しかし、似合うライン...

欲しい内容を追加します。一致する行Name: 123と次の行の2行を削除します。私は以下を使ってこれを行いますsed

sed -e '/Name: 123/{N;d}' filename

答え3

使用ed:

$ printf '%s\n' 'g/^ / s///\' '-,.j' 'g/^Name: /d' 'g/SHA-256-Digest: /d' '4,$g/^$/d' ,p Q | ed -s file
Manifest-Version: 1.0
Version-Info: ....

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

これにより、入力ファイルに次の編集スクリプトが適用されます。

g/^ / s///\
-,.j
g/^Name: /d
g/SHA-256-Digest: /d
4,$g/^$/d
,p
Q

これは6つの個別のコマンドで構成されています。

  1. これら2つのコマンドは、空白文字で始まるすべての行s///に適用されます。-,. jコマンドの空の正規表現は前のコマンドの式を再利用するため、正規表現に一致する行にs1 つ以上のコマンドを適用するために使用されるため、コマンドは最初のスペースを削除します。その後、このコマンドは変更された行を前の行に関連付けます。これにより、入力データの改行が効果的にキャンセルされます。^gsj

  2. このコマンドは、d次から始まるすべての行で機能しName:て削除します。

  3. 同様に、で始まる行がSHA-256-Digest:削除されます。

  4. 4行目から空白行を削除してください。

  5. 結果を表示するために、バッファ全体を標準出力として印刷します。

  6. Q無条件にエディタを終了します(wq変更を元のファイルに書き換えることができます)。

答え4

sed -e '
   4,$!d;      # skip non-relevant portion
   /Name:/N;   # grab the line coming after Name:
   /\n.* /d;   # what we were after is not this
   P;D
' yourfile

関連情報