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:
-
s/^.*bbsp.\/rt// ou s#^.*bbsp./rt##
-
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