タイトルは次のとおりですRemove all lines between two similar patterns, including the line of the starting pattern. if another specific pattern in between is not matched
。 Google で回答を検索する他のユーザーが読みやすくなったため、短くしました。
質問について:特定のコンピュータに対して有価の株式と市場不可能な株式のリストがあります。共有を一覧表示できるすべてのコンピュータのリストを作成し、読み取れない共有を削除したいと思います。しかし、2つの問題に遭遇しました。まず、2 つの類似パターン間のすべての行を正しく削除します。第二に、特定のパターンが見つかった場合、同様の2つの単語間の行を削除しない方法です。
私のアドバイスは
Shares for DED-SHD-ED-5:
[--- Unreadable Shares ---]
ADMIN$
C$
E$
H$
IPC$
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-8:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
Shares for DED-SHD-ED-9:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
VBRCatalog
[--- Listable Shares ---]
backup backup2
次のコマンドを使用して、読み取れないすべての共有を削除しましたawk '/Listable Shares/,/Shares for/' input.txt
。このコマンドの問題はDED-SHD-ED-8
noでしたListable Shares
。下のコンピュータを剥がしてからDED-SHD-ED-9
販売可能な在庫を見ることができます。DED-SHD-ED-9
DED-SHD-ED-8
以下の出力を参照してください(リスト内の最初のコンピュータの名前が欠落していることを知っていますが、問題ではありません)。
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-8:
[--- Listable Shares ---]
backup backup2
この問題を解決するために私の考えはawk '/Listable Shares/,/Shares for/' input.txt
。まず、「共有対象」と「共有対象」の間のすべての行を削除してみました。私はより簡単な答えを見つけ、現在では理解できない複雑な答えを避けるためにフォーラムを見学しました。たとえば、このコマンドを使用しましたが、sed '/^Shares for/,/^Shares for/{//!d;};' input.txt
ここではsed '/Shares for/,/:/{//!d;};' input2.txt
コンピュータ間の線の半分を削除しました。
出力
Shares for DED-SHD-ED-5:
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
Shares for DED-SHD-ED-8:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
なぜコンピュータデータの半分しか削除されないのですか?なぜかわかりません。
Listable
次のアイデアは、パターンがその行で一致する場合、「Shares for」と「Shares for」の間の行が削除されないように、コマンドに除外を追加することでした。次に、DED-SHD-ED-5
などのデータがないコンピュータを削除しますDED-SHD-ED-7
。しかし、たぶんこれが最善のアプローチではないかもしれません。 「Listable」スキーマは表示されないため、最初のスキーマの行を削除する方が良いかもしれません。
この問題を正しく処理する方法についてのヘルプと洞察力が必要です。
予想出力:
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-9:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
VBRCatalog
[--- Listable Shares ---]
backup backup2
ベストアンサー1
これはあなたに効果がありますか? shares
サンプル入力用に選択したファイル名。
sed -e 'tD' -e '$!N;/.\nShares/s/\n/&&/;:D' -e 'P;D' shares | awk 'BEGIN{RS="\n\n";FS="\n"}/Listable/'
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-9:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
VBRCatalog
[--- Listable Shares ---]
backup backup2
デフォルトでは、改行がない場合はsed
前に挿入されます。したがって、改行は次のようにShares
使用できます。これで問題は簡単です。その単語を含むレコードのみを印刷します。RS="\n\n"
awk
Listable