O comando que você está pedindo para decodificar + es e % sequências dos URLs é não apenas um comando sed , é um canal que processa entradas com sed , então canaliza para xargs para processamento adicional. Primeiro vamos ver o comando sed :
sed 's@+@ @g;s@%@\x@g'
Você pode estar mais acostumado a vê-lo com / em vez de @ como separador, o que poderia facilmente ter sido feito aqui sem complicação, pois / não aparece em nenhum dos padrões de pesquisa nem em nenhum dos textos de substituição . Este comando é equivalente:
sed 's/+/ /g;s/%/\x/g'
Como / , @ é um caractere de pontuação perfeitamente bom para sed .
Em cada linha de entrada:
-
s@+@ @g ( s/+/ /g ) substitui ocorrências ( s ) de + por um espaço. Isso afeta todos os + es em uma linha ( g ), não apenas o primeiro.
-
; termina a ação ("comando") e permite que você especifique outra no mesmo "script".
-
s@%@\x@g ( s/%/\x/g ) substitui ocorrências ( s ) de % com \x . Como antes, ele age em todos ao invés de apenas no primeiro de cada linha ( g ).
Em \x , o \ representa apenas um \ porque \ tem um significado especial para sed . Seu significado especial é, na verdade, como o personagem que você usa para tirar o significado especial de outro personagem que vem depois dele que, de outra forma, teria um significado especial. Então deve ser escapado como \ .
Agora vamos ver o comando xargs , cuja finalidade é executar printf .
xargs constrói linhas de comando. Se você executar xargs command... , em que command... é uma ou mais palavras, xargs executa command... com argumentos da linha de comando lidos a partir de sua entrada. Nesse caso, a entrada para xargs é a saída de sed , por causa do canal ( | ). Normalmente, xargs interpreta qualquer espaço em branco em sua entrada para significar que o texto antes e depois constitui argumentos separados, mas a opção -0 faz com que ele divida os argumentos nas ocorrências da caractere nulo em vez disso.
No uso pretendido do seu comando, um caractere nulo não aparecerá e xargs executará printf %b com apenas um argumento de linha de comando adicional, a saída do sed comando. Assim, embora não seja equivalente em geral, neste caso, todo o pipeline poderia ter sido escrito assim usando substituição de comando em vez de xargs :
printf '%b\n' "$(sed 's/+/ /g;s/%/\x/g')"
Quanto ao que printf pretende fazer aqui, como diz muru O especificador de formato %b consome e imprime um argumento (como %s ), mas causa escapes de barra invertida - da ordem em que o comando sed no lado esquerdo do canal foi gravado para gerar - para ser translated para os personagens que eles representam .
Suponha que eu execute esse comando e passe http://foldoc.org/debugging%20by%20printf como entrada. Eu recebo http://foldoc.org/debugging by printf como saída, porque as seqüências %20 são traduzidas em espaços.