我发现了一个类似的问题:
但在这种情况下,我想检查的不是总长度,而是行中的位数。例如,从此输入中:
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位数字的行?
答案1
由于您标记了您的问题perl
,因此在 perl 中执行此操作的一种方法是利用 perltr
返回替换字符数的计数这一事实;例如(采取N = 13
)你可以这样做
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
一种可能更传统的方法是在标量上下文中评估正则表达式匹配以获得计数
perl -ne '$c = () = /\d/g; print unless $c > 13' file
答案2
只保留具有 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 > output.txt
开关-e
为“执行”;它只是传递一个命令。我们在这里需要它,因为我们要经过不止一个。
如果最后一个命令执行了替换,则该t
命令将跳过其余命令。s
命令p
打印。