O que faz :: no script de sed

0

Eu gostaria de saber o que ele realmente faz com os seguintes scripts usados com o comando sed.

sed -e 's:<F0_M>:<o,f0,male>:' \
          -e 's:<F0_F>:<o,f0,female>:' \
          -e 's:([0-9])::g' \
          -e 's:<sil>::g' \
          -e 's:([^ ]*)$::' | \

Primeiro e segundo scripts parece que estamos transformando o texto do tipo <F0_F> para <o,f0,female> . Mas e os três últimos em que envolve '::','g' and '$' sign. Na maioria das documentações, eles usaram '\' e '/' na maioria dos scripts. Mas aqui eles usaram ':' em vez de barras. Alguém pode explicar acima de três scripts?

    
por udani 17.01.2016 / 08:48

1 resposta

3

O delimitador padrão usado nos comandos sed é / , como em comandos como este:

sed -e s/foo/bar/g < input > output

No entanto, se o comando s for seguido por um caractere diferente, esse se tornará o delimitador para essa expressão específica.

O uso de delimitadores que não são / é comum quando o próprio delimitador precisa aparecer no comando, e assim exigiria atenção cuidadosa para escapando . Por exemplo, um / delimitador é chato de lidar em scripts que lidam com caminhos Unix.

Isso não parece ser o caso aqui, então presumo que o autor desse comando simplesmente prefira : como um delimitador nos comandos sed .

Seu comando tem cinco expressões:

s:<F0_M>:<o,f0,male>:

Isso substitui a primeira instância de <F0_M> em cada linha da entrada por <o,f0,male> na saída. Se houver mais de uma correspondência na entrada dessa linha, as subsequentes serão deixadas em paz.

As aspas simples apenas impedem que o shell interprete qualquer um dos caracteres na expressão. Eles são todos passados literalmente para o comando sed .

s:<F0_F>:<o,f0,female>:

Semelhante ao caso acima, apenas aparentemente para o outro gênero.

s:([0-9])::g

Remove todos os dígitos únicos entre parênteses das linhas de entrada.

Ao contrário das duas expressões anteriores, essa expressão afeta todas as instâncias de cada linha, por causa do g , que significa "global".

Observe que isso funciona apenas em dígitos únicos. Não fará nada para (42) , por exemplo.

s:<sil>::g

Remove todas as instâncias <sil> de cada linha da entrada ao gravar na saída.

s:([^ ]*)$::

Remove um caractere com parênteses no final da linha, se não contiver um espaço. Também remove um par de parênteses vazios no final de uma linha.

Existem livros completos sobre esses tópicos, sed e expressões regulares. Uma única resposta realmente não é o lugar certo para aprender todo o tópico.

A expressão acima é realmente um pouco complicada a esse respeito: $ atribui uma expressão regular (ou regex para breve) ao final de uma linha e ^ para o início, mas o ^ nesse expressão significa algo diferente.

Recomendo que você leia Expressões regulares de masterização de Jeffrey Friedl.

    
por 17.01.2016 / 09:11

Tags