我有一个如下所示的文件:
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/,放入示例文件,然后闲逛几分钟。这是一个很棒的工具。