precisa entender o uso de “/” no comando sed

3

Eu quero entender o comando sed

Por exemplo, eu tenho o comando:

rtNum='pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//''

e

rtRun='pwd | sed -e 's/^.*bbsp.\/rt.*\///''

em que pwd é: /tfsrun/bbsp2/rt3/run produz a saída como:

echo $rtNum 
3

e

echo $rtRun 
run

Eu quero entender o comando sed acima, especialmente o uso de -e e o uso de / 's, // e /// no comando acima sed.

    
por Anand Kumar Singh 27.01.2017 / 11:06

3 respostas

4

Conforme o manual informa, a opção -e informa que um script está seguindo. Seu script está substituindo o conteúdo correspondente por uma string vazia usando uma expressão regular.

Para entender expressões regulares, recomendo reservar um tempo suficiente para ler e. g. link

Para sua pergunta: \/ são barras de escape, o que significa que elas não serão tratadas como um separador. / são os separadores para separar a string correspondente da string de destino

e. g. 's/matchingstring/targetstring/' s invoca a substituição da primeira ocorrência de matchingstring por targetstring.

No seu caso:

  • '//' significa que o targetstring está vazio, pois não há nada entre os separadores
  • '///' na verdade é '\///' , o que significa que o matchingstring termina com uma barra e o targetstring está vazio.
por 27.01.2017 / 11:50
1

A -e flag para sed é uma maneira de dizer "execute / run this". É necessário se você deseja executar vários comandos de edição de sed na mesma invocação de sed (a menos que você os separe com ; ).

Por exemplo, para extrair / imprimir apenas as linhas 1 e 20 a 30 de um arquivo (o sinal -n desativa a saída padrão de cada linha de entrada):

$ sed -n -e '1p' -e '20,30p'

Em sed , barras únicas ( / ) são usadas para delimitar expressões regulares.

Por exemplo, excluindo todas as linhas que contenham a string "hello" seguida de "word" mais tarde na mesma linha:

$ sed '/hello.*world/d'

Você pode ver uma barra dupla nas substituições às vezes. O comando s em sed realiza uma substituição de algo que corresponde a uma expressão regular com uma string:

s/pattern/replacement/

Se a intenção for excluir a coisa que corresponde ao padrão, a substituição estará vazia e terminaremos com

s/pattern//

A barra tripla ( /// ) vem de alguém tentando excluir um padrão terminando com uma barra . Como as barras são usadas como delimitadores, você também notará que a primeira barra é escapada com uma barra invertida ( \/ ) formando \/// . "Escapeado" significa "feito para ser tratado como um caractere literal, não como um delimitador".

Existem algumas outras maneiras de contornar as barras desajeitadas ao fazer uma substituição em sed . Tome a substituição

s/\///

Isso exclui o primeiro / em cada linha (na verdade, substitui nada ).

Uma alternativa é escrever

s/[/]//

Isso coloca a barra em um grupo de caracteres ou expressão de colchetes . Todos os caracteres desse grupo são sempre tratados como caracteres literais por sed . Uma expressão de colchetes corresponde apenas a um caractere do caractere listado dentro dele.

Outra abordagem é usar outro delimitador:

s#/##

Aqui, o caractere # assume o papel de delimitador (um pode escolher qualquer caractere). Para corresponder um # ao usar # como um delimitador, é preciso usar \# ou [#] , assim como era necessário fazer ao usar o delimitador / padrão.

Então, olhando para a linha de comando sed

sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'

Isso realiza duas operações de edição:

  1. s/^.*bbsp.\/rt// ou s#^.*bbsp./rt##
  2. s/\/.*$// ou s#/.*$##

Ambas são substituições (o comando s editing em sed ), e ambas substituem o padrão que corresponde a nada, ou seja, ambos deletam algo da entrada.

O primeiro padrão é ^.*bbsp.\/rt e corresponderá a partir do início da linha ( ^ ), qualquer número de qualquer caractere ( .* ), seguido pela string bbsp , seguido por algum outro caractere ( . ) e a string /rt .

Assim, parece que vai apagar tudo na linha até e incluindo o /rt após bbsp. , onde . representa qualquer caractere.

O segundo padrão, \/.*$ , corresponderá a qualquer coisa após um / ao final da linha ( $ ).

Então, dada a linha de texto

/tfsrun/bbsp2/rt3/run

A primeira substituição irá transformá-lo em

3/run

e o segundo irá transformá-lo em

3
    
por 27.01.2017 / 13:22
0

Aqui estão as citações de man sed

-e script, --expression=script

  add the script to the commands to be executed

s/regexp/replacement/

  Attempt to match regexp against the pattern space.  If successful, replace  
  that  portion  matched  with  replacement.  The replacement may contain the
  special character & to refer to that portion of the pattern space which
  matched, and the special escapes  through  to refer to the corresponding
  matching sub-expressions in the regexp.
    
por 27.01.2017 / 11:35

Tags