Как вырезать после позиции до определенного символа в unix

#shell #unix #aix

#оболочка #unix #aix

Вопрос:

У меня есть имя файла как dat_cpoybook_tab1_tab2_tabnm.txt . Я хочу вырезать из tab1. т.е. Мой вывод будет:

tab1_tab2_tabnm

Пожалуйста, обратите внимание, что каждый раз, когда мне нужно вырезать его после двух ‘_’ до ‘.txt’

Ответ №1:

 grep -Po '([^_] _){2}[^_] (?=.txt)'

kent$  echo "a_bx_c_d_e_f_g.txt"|grep -Po '([^_] _){2}[^_] (?=.txt)' 
e_f_g

kent$  echo "dat_cpoybook_tab1_tab2_tabnm.txt"|grep -Po '([^_] _){2}[^_] (?=.txt)'
tab1_tab2_tabnm
 

awk:

 awk -F'_|[.]txt' -v OFS="_" '$0=$(NF-3) OFS $(NF-2) OFS $(NF-1)'

kent$   echo "a_bx_c_d_e_f_g.txt"|awk -F'_|[.]txt' -v OFS="_" '$0=$(NF-3) OFS $(NF-2) OFS $(NF-1)'                                                                          
e_f_g
 

Комментарии:

1. grep: не распознанный флаг: P grep: не распознанный флаг: o

2. @user3726320 смотрите другой способ в ответе

Ответ №2:

 echo "dat_cpoybook_tab1_tab2_tabnm.txt"|awk -F'.' '{print $1}'|awk -F'_' '{ARR[1]=$0;} 
END {
v1=match(ARR[1],"_");
s1=substr(ARR[1],v1 1);
v2=match(s1,"_"); 
print substr(s1,v2 1);       
}'