Gostaria de perguntar sobre como extrair strings específicas de um arquivo usando sed e expressões regulares.
Abaixo está o exemplo do arquivo de texto de entrada (testfile.txt):
# This file contains a short description of the columns in the
# meta-analysis summary file, named '/some/output/directory/result.txt'
# (Skipping some comment lines...)
# Input for this meta-analysis was stored in the files:
# --> Input File 1 : /some/input/directory/cohort1/dataset1_chrAll.regenie.txt
# --> Input File 2 : /some/input/directory/cohort2/subdir1/chrAll-out.txt
# --> Input File 3 : /some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
# --> Input File 4 : /some/input/directory/cohort3/resfile.txt
# --> Input File 5 : /some/input/directory/cohort4/regenie_res_chrAll.txt
Deste arquivo, gostaria de extrair a lista de nomes de arquivos de entrada, então o resultado deve ser algo como:
/some/input/directory/cohort1/dataset1_chrAll.regenie.txt
/some/input/directory/cohort2/subdir1/chrAll-out.txt
/some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
/some/input/directory/cohort3/resfile.txt
/some/input/directory/cohort4/regenie_res_chrAll.txt
Veja abaixo o que eu tentei:
Tentativa 1
Este é o comando inicial que usei.
cat testfile.txt | sed -e 's/\/some\/input\/directory\/([A-z0-9\/\.\-]*)\.txt/$1/g'
Resultado:
sed: -e expression #1, char 55: Invalid range end
Tentativa 2
Depois de alguma pesquisa, tentei escapar dos parênteses usando barras invertidas.
cat testfile.txt | sed -e 's/\/some\/input\/directory\/\([A-z0-9\/\.\-]*\).txt/$1/g'
Resultado:
sed: -e expression #1, char 56: Invalid range end
Então isso não resolveu o problema.
Tentativa 3
Também tentei escapar dos colchetes.
cat testfile.txt | sed -e 's/\/some\/input\/directory\/\(\[A-z0-9\/\.\-\]\*\)\.txt/$1/g'
Resultado:
# This file contains a short description of the columns in the
# meta-analysis summary file, named '/some/output/directory/result.txt'
# (Skipping some comment lines...)
# Input for this meta-analysis was stored in the files:
# --> Input File 1 : /some/input/directory/cohort1/dataset1_chrAll.regenie.txt
# --> Input File 2 : /some/input/directory/cohort2/subdir1/chrAll-out.txt
# --> Input File 3 : /some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
# --> Input File 4 : /some/input/directory/cohort3/resfile.txt
# --> Input File 5 : /some/input/directory/cohort4/regenie_res_chrAll.txt
Isso não gerou um erro, mas não era isso que eu queria.
Tentativa 4
Por fim, tentei adicionar a opção -r sem escapar parênteses ou colchetes.
cat testfile.txt | sed -re 's/\/some\/input\/directory\/([A-z0-9\/\.\-]*)\.txt/$1/g'
Resultado:
sed: -e expression #1, char 55: Invalid range end
Apareceu a mesma mensagem de erro na primeira tentativa.
Gostaria de perguntar quais são os problemas nas minhas linhas de comando e se há alguma solução possível para isso.
Obrigado.
Isso pode funcionar para você (GNU sed):
Desative a impressão implícita usando a opção de linha de comando
-n
.Usando o comando de substituição e correspondência de padrões, procure uma linha que comece com a
# --> Input File
seguida por um ou mais dígitos seguidos por:
e remova essa parte e imprima o restante.Uma alternativa:
O que eu faria:
A expressão regular corresponde ao seguinte:
-->
.*
\K
K
ept) como uma alternativa mais curta ao uso de uma asserção look-behind: look arounds e Suporte de \K em regex(?:
/
[\w.-]+
)+
Com
awk
:Com
sed
:Isso diz... "execute
sed
, mas não imprima nada, a menos que veja uma linha contendoInput File
. Se vir, substitua tudo, até dois pontos e um espaço, por nada e imprima o resultado."Com Raku/Sparrow você pode adotar uma abordagem incremental dividindo expressões regulares complexas em uma sequência de etapas simples (chamada técnica de zoom in)