Como extrair string entre dois caracteres com sed [duplicate]

1

Eu preciso de ajuda com sed . Eu tentei procurar informações para fazer isso, mas não consegui encontrar nenhum específico e as pessoas dificilmente fornecem uma explicação da solução fornecida, o que dificulta entender como o sed funciona.

Basicamente eu tenho arquivos com o seguinte formato:

NAME_DIGITS_ddd-11s-21a-ds_DIGITS_DIGITS.xml

Eu quero copiar os primeiros DIGITS (por exemplo, 00004574 ), que é a string entre o primeiro e o segundo sublinhados.

Alguma ideia de como fazer isso?

Considerando que os primeiros dígitos podem ser 0 , o que posso fazer para excluí-los?

Eu apreciaria qualquer exemplo para esses dois casos e uma explicação seria muito bem-vinda também.

Eu consegui o oposto: exclua os caracteres entre o primeiro e o segundo sublinhados com: sed s/_[^_]*_/_/ , mas não consigo ver como fazer o que realmente preciso.

    
por Fithos 20.08.2015 / 11:48

4 respostas

2

Você escreveu que tem arquivos com o seguinte formato: NAME_DIGITS_ddd-11s-21a-ds_DIGITS_DIGITS.xml e deseja copiar (extrair?) os primeiros DIGITS, entre os underscores.

Como suas seções são separadas por sublinhados, você pode usar algo assim:

echo NAME_DIGITS_ddd-11s-21a-ds_DIGITS_DIGITS.xml | cut -d_ -f2

O comando cut extrai o campo 2 ( -f2 ) usando sublinhado como o delimitador especificado ( -d_ )

    
por 20.08.2015 / 12:01
1
 awk -F "_" '{print $2}'

faria o truque!

Além disso, se você realmente quiser usar o sed

sed 's/^[^_]*_\([^_]*\)_.*//g'

Como o sed não tem uma correspondência não voraz, precisamos procurar por algo que não seja _ entre o primeiro e o segundo sublinhados!

    
por 20.08.2015 / 11:53
0

O comando que você quer é:

sed -ne 's/^[^0-9_][^_]*_0*\([0-9]*\)_.*//p'

Exclua o 0 * se quiser que os zeros iniciais apareçam.

    
por 20.08.2015 / 12:51
0

Outro sed

sed '/\n/!{s/_0*/\n/g;D;};P;d'

ou

sed 's/_0*/\n/;/^[0-9]/!D;P;d'
    
por 20.08.2015 / 12:36

Tags