我有一个如下所示的文件:
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
fd_tr_mn_0716
fd_tr_mn_09013
fd_tr_mn_092433
fd_tr_mn_1020333
fd_tr_mn_12013332
dsdas_1
dsdas_12
dsdas_212
sdasd_4567
weqwe_32323
dasds_232322
2321321_rewrwe_3233
32_Ff
asdasd_1_fff
我需要删除以长度为 4-8 的数字结尾的行;还可以删除以数字开头的行。
下面的代码可以匹配我想要删除的行,但是在该匹配上进行反向匹配并添加-iv
不起作用。
cat test.txt | grep -oP '(?<![0-9])[0-9]{4,8}(?![0-9])'
答案1
要删除以下行:
以数字开头:
^[0-9]
或^\d
or 以 4~8 个字符长度的数字结尾:
[0-9]{4,8}$
或\d{4,8}$
。grep -vE '^[0-9]|[0-9]{4,8}$' infile >output sed -E '/^[0-9]|[0-9]{4,8}$/d' infile >output grep -vP '^\d|\d{4,8}$' infile >output
要删除以下行:
以数字开头:
^[0-9]
或以确切地4~8 个字符长度的数字:
[^0-9][0-9]{4,8}$
或\D\d{4,8}$
。grep -vE '^[0-9]|[^0-9][0-9]{4,8}$' infile >output sed -E '/^[0-9]|[^0-9][0-9]{4,8}$/d' infile >output grep -vP '^\d|\D\d{4,8}$' infile >output
答案2
使用任何 POSIX awk:
$ awk '!( /^[0-9]/ || /(^|[^0-9])[0-9]{4,8}$/ )' file
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
dsdas_1
dsdas_12
dsdas_212
asdasd_1_fff
答案3
使用乐(以前称为 Perl_6)
下面删除以数字开头的行,或包含与行结尾相邻的 4 到 8 位数字的行(unless
与 同义if not
):
raku -ne '.put unless /^ \d | \d ** 4..8 $ /;'
输入示例:
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
fd_tr_mn_0716
fd_tr_mn_09013
fd_tr_mn_092433
fd_tr_mn_1020333
fd_tr_mn_12013332
dsdas_1
dsdas_12
dsdas_212
sdasd_4567
weqwe_32323
dasds_232322
2321321_rewrwe_3233
32_Ff
asdasd_1_fff
示例输出:
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
dsdas_1
dsdas_12
dsdas_212
asdasd_1_fff
注意:上面将删除诸如 之类的行,因为 8 位数字与行尾fd_tr_mn_123456789
相邻。$
如果 OP 希望保留数字串比...更棒与行结尾相邻的 8 位数字,以下正则表达式有效:
raku -ne '.put unless /^ \d | \D\d ** 4..8 $ /;'
上面,一行诸如此类的fd_tr_mn_123456789
行将保留在返回中。