匹配模式后删除特定行

匹配模式后删除特定行

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

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行将保留在返回中。

https://raku.org

相关内容