Primeiro, vamos começar das opções de linha de comando:
-
-n
desativa a saída normal do buffer. Apenas linhas solicitadas para impressão (por exemplo, com o comandop
) serão impressas -
-r
ativa o regexp estendido -
-e
não é realmente necessário quando estamos especificando comandos sed na linha de comando e não do arquivo
Agora vem os comandos sed. Existem dois, separados por ;
character. Sed vai linha por linha e executa esses dois comandos em ordem. Mas só se eles combinarem. Aqui, ambos os comandos são prefixados com /SOMETHING/
, o que significa que este comando só é executado se a linha atual corresponder a SOMETHING
regexp.
/jar$/
regexp corresponde apenas se a linha atual terminar com jar
. % Regexp /class$/
semelhante coincide apenas se a linha atual terminar com class
. Agora, se determinada linha corresponder, ela executa dois comandos (eles são agrupados com {}
) - no primeiro caso, é x
e, em seguida, d
. No segundo caso, é o comando x
e, em seguida, p
.
-
O comando
x
éeXchange
.sed
tem um buffer que você pode usar para armazenar algumas linhas. Este comando troca este buffer com a linha atual (então a linha atual vai para esse buffer e o conteúdo do buffer se torna a linha atual).
O comando -
d
descarta a linha atual, lê a nova e começa a executar os comandos sed da primeira linha (todos os comandos apósd
são ignorados para a linha atual).
O comando -
p
imprime a linha atual. Como usamos os argumentos do comando-n
apenas as linhas impressas comp
serão mostradas na saída.
Então, para resumir:
-
/jar$/ { x; d; }
significa - se a linha atual terminar comjar
, salve-a no buffer -
/class$/ { x; p; }
significa - se a linha atual terminar comclass
, obtenha o conteúdo do buffer (que deve conter a última linha terminando comjar
, a menos que haja um arquivo terminando comclass
) e imprima