在 unix 系統上,我有一個檔案,我需要洗掉所有匹配的行,Package: <PKG_NAME>直到找到一個空行。這是一個示例,我需要洗掉terminfo資訊:
...
Package: kmod-usb-storage
Version: 5.4.218-1
Depends: kernel (= 5.4.218-1-0c02597a113d34441a9bfe9294e3fb84), kmod-scsi-core, kmod-usb-core
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667822688
Auto-Installed: yes
Package: terminfo
Version: 6.2-1
Depends: libc
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Package: libuci-lua
Version: 2020-10-06-52bbc99f-5
Depends: libc, libuci20130104, liblua5.1.5
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Auto-Installed: yes
...
之后我不需要關于以下內容的資訊terminfo:
...
Package: kmod-usb-storage
Version: 5.4.218-1
Depends: kernel (= 5.4.218-1-0c02597a113d34441a9bfe9294e3fb84), kmod-scsi-core, kmod-usb-core
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667822688
Auto-Installed: yes
Package: libuci-lua
Version: 2020-10-06-52bbc99f-5
Depends: libc, libuci20130104, liblua5.1.5
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Auto-Installed: yes
...
我將在 shell 腳本中使用此功能,我嘗試過使用sed但awk沒有任何有用的結果,我無法解決這個問題。
uj5u.com熱心網友回復:
你可能會逃脫:
awk '!/terminfo/' RS= ORS='\n\n'
將 RS 設定為空字串會導致awk將每個部分視為一條記錄(“部分”表示由空行分隔的文本塊,通常稱為“段落”),因此您只需列印與字串不匹配的部分terminfo。更準確地說,您可能想要使用:
awk '!/^Package: terminfo/' RS= ORS='\n\n'
但這似乎沒有必要。
uj5u.com熱心網友回復:
您也可以使用sed '/terminfo/,/^$/d'. 這將從包含terminfo直到找到空行的行中洗掉。
請參閱如何在兩個模式之間列印線,包括或不包括(在 sed、AWK 或 Perl 中)?對于處理多行的更多此類問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529240.html
標籤:壳Unixawksed
