Primeiro, vamos começar das opções de linha de comando:
-
-ndesativa a saída normal do buffer. Apenas linhas solicitadas para impressão (por exemplo, com o comandop) serão impressas -
-rativa o regexp estendido -
-enã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.sedtem 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 -
ddescarta a linha atual, lê a nova e começa a executar os comandos sed da primeira linha (todos os comandos apósdsão ignorados para a linha atual).
O comando -
pimprime a linha atual. Como usamos os argumentos do comando-napenas as linhas impressas compserã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