从文件中删除数字和字符

从文件中删除数字和字符

我有一个如下所示的文件:

chs_de_le_q1gg
dsdas_212
sdasd_4567
weqwe_32323
dasds_232322
rr_F3r4
we_ff
asdasd_1_fff
sdfsd_tr
dsd_fr

我需要删除以长度为 4-8 的数字结尾的行;还可以删除以 ff 和 fr 结尾的行。

我无法同时输入数字和字母


cat test.txt |  grep  -vE "_[0-9]|[^0-9][0-9]{1,8}$\|_ff$|_fr$"

有人可以帮忙吗?

输出

dsdas_212
chs_de_le_q1gg
rr_F3r4
asdasd_1_fff
sdfsd_tr

答案1

您正在寻找的扩展正则表达式:

_[[:digit:]]{4,8}$
_f[fr]$

所以使用 grep :

grep -Ev -e '_[[:digit:]]{4,8}$' -e '_f[fr]$' test.txt

或者使用 sed,您可以添加-i直接将更改应用到文件

sed -E -e '/_[[:digit:]]{4,8}$/d' -e '/_f[fr]$/d' test.txt
  • -E使用扩展正则表达式
  • grep-e搜索所有给定的模式
  • sed-e将脚本添加到要执行的命令中
  • [:digit:]一个数字
  • {4,8}从 4 到 8
  • $行结束
  • [fr]两者f任一r

如果您还需要添加正则表达式,则需要-e随正则表达式一起添加。您可以根据需要添加任意数量-e,因此不要使正则表达式过于复杂。因此,在您的情况下,您可以添加 br, bd, rt :

_br$
_bd$
_rt$

答案2

.*(\d{4,8}$|f[fr]$)

这表示“任意数量的字符 (.*) 后跟行尾 ($) 处的 4-8 位数字 (\d{4-8),或者后跟 f 以及 f 或 r 之一 (f[fr] ) 位于行尾(4)"

一种更简单且可扩展的方式:

.*(\d{4,8}|ff|fr|br|cu)$

一般来说,新的结尾可以通过将它们放在 () 内来添加,并用另一个“|”分隔。

我通过去解决了这个问题https://regex101.com/,放入示例文件,然后闲逛几分钟。这是一个很棒的工具。

相关内容