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