删除第二次和第二次最后一次匹配之间的所有内容

Mit*_*tel 5 text-processing

我有我想格式化的字符串。我想删除 second;和 second last之间的所有内容;

输入

cellular organisms;Eukaryota;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;  
Run Code Online (Sandbox Code Playgroud)

输出

cellular organisms;Eukaryota;Tribolium castaneum;
Run Code Online (Sandbox Code Playgroud)

我试过使用 sed

sed 's/;[^;]*//' <<<"cellular organisms;Eukaryota;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;"
Run Code Online (Sandbox Code Playgroud)

产生

cellular organisms;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 6

你可以很容易地做到这一点awk

awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Run Code Online (Sandbox Code Playgroud)

这使用;( -F\;)拆分输入,并打印第一个 ( $1)、第二个 ( $2)、倒数第二个和最后一个字段($(NF-1)$NF;NF包含字段数)。

以下变体在输出中重新使用指定的字段分隔符:

awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Run Code Online (Sandbox Code Playgroud)

Janis建议使用以下改进版本OFS

awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
Run Code Online (Sandbox Code Playgroud)

或者,如果要将分隔符保留为另一个参数:

awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'
Run Code Online (Sandbox Code Playgroud)