Удалить часть между двумя шаблонами в Bash - PullRequest
0 голосов
/ 13 апреля 2019

Допустим, у меня есть огромный файл с этим:

(Ano_gla|EOG091B00FI:0.21327484,Tri_cas|EOG091B00FI:0.14561670,((Tri_bro|EOG091B00FI:0.00523450,Tri_jap|EOG091B00FI:0.01261030)1.00
0000:0.26780267,(((((Orm_nit|EOG091B00FI:0.00243200,Orm_pom|EOG091B00FI:0.00914980)1.000000:0.08747204,(((((Meg_dor|EOG091B00FI:0.0
0953580,Meg_sti|EOG091B00FI:0.02205870)1.000000:0.09005934,(Cer_mar|EOG091B00FI:0.00429740,Cer_sol|EOG091B00FI:0.02112877)1.000000:
0.07852307)0.937000:0.01510878,(((Cec_fun|EOG091B00FI:0.04067119,(Tri_sar|EOG091B00FI:0.00462004,(Nas_gir|EOG091B00FI:0.00126111,Na
s_lon|EOG091B00FI:0.00087461)0.877000:0.00251191)0.995000:0.01752929)1.000000:0.04366313,(Tri_bra|EOG091B00FI:0.00461186,Tri_pre|EO
G091B00FI:0.01023626)1.000000:0.44067486)0.000000:0.01008020,(Ana_pse|EOG091B00FI:0.07264534))

И я ищу метод bash для удаления части между | и :

и получите:

(Ano_gla:0.21327484,Tri_cas:0.14561670,((Tri_bro:0.00523450,Tri_jap:0.01261030)1.00
0000:0.26780267,(((((Orm_nit:0.00243200,Orm_pom:0.00914980)1.000000:0.08747204,(((((Meg_dor:0.0
0953580,Meg_sti:0.02205870)1.000000:0.09005934,(Cer_mar:0.00429740,Cer_sol:0.02112877)1.000000:
0.07852307)0.937000:0.01510878,(((Cec_fun:0.04067119,(Tri_sar:0.00462004,(Nas_gir:0.00126111,Na
s_lon:0.00087461)0.877000:0.00251191)0.995000:0.01752929)1.000000:0.04366313,(Tri_bra:0.00461186,Tri_pre:0.01023626)1.000000:0.44067486)0.000000:0.01008020,(Ana_pse:0.07264534

Я пытался:

sed -e 's/\(|\).*\(:\)/\1\2/g' myfile 

, но это не работает.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019
sed ':a;$!{N;ba};s/|[^:]*//g' myfile

Разъяснения:

:a           # Label to jump to
$! {         # On every line but the last one
    N        # Append next line to pattern space
    ba       # Jump to label
}
s/|[^:]*//g  # Remove every pipe up to (and excluding) the next colon

Это сбрасывает весь файл в пространство шаблона, а затем выполняет одну глобальную замену.

Обратите внимание, что это оставляет закрывающим )) входного файла на месте, в отличие от вашего ожидаемого вывода.


Для sed, отличных от GNU sed, команда должна быть немного отделена, чтобы метка была отдельной:

sed -e ':a' -e '$!{N;ba;}' -e 's/|[^:]*//g' myfile
1 голос
/ 14 апреля 2019

если ваши данные в файле 'd' попробуйте gnu sed,

sed -E 's/\|[^:]+:/:/g' d
1 голос
/ 13 апреля 2019
$ sed 's/|[^|:]*:/:/g' file
(Ano_gla:0.21327484,Tri_cas:0.14561670,((Tri_bro:0.00523450,Tri_jap:0.01261030)1.00
0000:0.26780267,(((((Orm_nit:0.00243200,Orm_pom:0.00914980)1.000000:0.08747204,(((((Meg_dor:0.0
0953580,Meg_sti:0.02205870)1.000000:0.09005934,(Cer_mar:0.00429740,Cer_sol:0.02112877)1.000000:
0.07852307)0.937000:0.01510878,(((Cec_fun:0.04067119,(Tri_sar:0.00462004,(Nas_gir:0.00126111,Na
s_lon:0.00087461)0.877000:0.00251191)0.995000:0.01752929)1.000000:0.04366313,(Tri_bra:0.00461186,Tri_pre|EO
G091B00FI:0.01023626)1.000000:0.44067486)0.000000:0.01008020,(Ana_pse:0.07264534))

или если ваш ввод действительно разбит на строки, тогда с GNU sed для -z:

$ sed -z 's/|[^|:]*:/:/g' file
(Ano_gla:0.21327484,Tri_cas:0.14561670,((Tri_bro:0.00523450,Tri_jap:0.01261030)1.00
0000:0.26780267,(((((Orm_nit:0.00243200,Orm_pom:0.00914980)1.000000:0.08747204,(((((Meg_dor:0.0
0953580,Meg_sti:0.02205870)1.000000:0.09005934,(Cer_mar:0.00429740,Cer_sol:0.02112877)1.000000:
0.07852307)0.937000:0.01510878,(((Cec_fun:0.04067119,(Tri_sar:0.00462004,(Nas_gir:0.00126111,Na
s_lon:0.00087461)0.877000:0.00251191)0.995000:0.01752929)1.000000:0.04366313,(Tri_bra:0.00461186,Tri_pre:0.01023626)1.000000:0.44067486)0.000000:0.01008020,(Ana_pse:0.07264534))
...