Shell-Script

只保留包含 x 或更少數字的行。文本文件

  • November 30, 2017

我發現了一個類似的問題:

但在這種情況下,我想檢查的不是總長度,而是行中的位數。例如,在這個輸入中:

cdc85e24-b9e9-8802-080a-b84479e1ae82  
ekodeveloper0  
1795475824.1129747.1472396049615.ref  
1795475824.1129747.1472396049615  
967175540.1194446.1472407271491  
wangxiuyan552  
jveazey  
xoloki  
whelee  
matthauck  
patel3.anirudh  
mischa.salle  

如何刪除所有超過 N 位的行?

只保留具有 X 或更多數字的行更容易。這是 X 為 13 的範例:

sed -n 's/[0-9]/&/13p' input.txt > output.txt

但是,您可以修改它以執行相反的操作。這是一個只保留少於 13 個數字的行的命令:

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt

說明 - 僅列印包含 13 個以上數字的行

sed -n 's/[0-9]/&/13p' input.txt > output.txt

替換文本中的&符號表示“匹配的所有內容”。

命令上的數字標誌s(在該/find/replace/部分之後)表示僅替換搜尋模式的該實例。

命令上的p標誌s表示“如果進行了替換則列印”。

當然,這個-n開關是為了抑制 Sed 的預設“列印”動作。

說明 - 僅列印 <13 個數字的行

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt &gt; output.txt

-e開關是“執行” ;它只是傳遞一個命令。我們在這裡需要它,因為我們要通過的不止一個。

如果最後一個命令執行了替換,則該t命令會跳過剩餘的命令。s

p命令列印。

由於您標記了您的問題,因此在 perl 中執行此操作的一種方法是利用 perl返回替換字元數的perl事實;tr所以例如(採取N = 13)你可以做

perl -ne 'print unless tr/[0-9]/[0-9]/ &gt; 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle

一種可能更傳統的方法是在標量上下文中評估正則表達式匹配以獲得計數

perl -ne '$c = () = /\d/g; print unless $c &gt; 13' file

例如,請參閱是否有一個 Perl 快捷方式來計算字元串中的匹配數?

引用自:https://unix.stackexchange.com/questions/320191