这个带有大量@ 符号的“sed”替换命令是如何工作的?

Raj*_*Raj 8 command-line sed text-processing

谁能解释一下这个sed命令是如何工作的?

sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 15

在 sed 中,替代命令通常写为s/pattern/replacement/options. 但是,没有必要使用/- 如果方便,您可以使用其他字符,因此可以是s@pattern@replacement@optionss:foo:bar:gs@+@ @g就像s/+/ /g-+用空格替换所有内容。同样s@%@\\x@g将 all 替换%\x(单个反斜杠是 sed 中的转义字符,因此您需要两个才能获得实际的反斜杠)。

foo+%2Fbar然后像这样的字符串将变成foo \x2Fbar. printf "%b"将扩展反斜杠转义的序列,如\x2F(十六进制值为 2F 的 ASCII 字符,即/),最终给你foo /bar.

  • 简而言之,一个 URL-> 文件名解码器。 (2认同)

Eli*_*gan 10

您要求从 URL解码+es 和%序列sed命令不仅仅是一个命令,它还是一个使用 处理输入的管道sed,然后将其输送到以xargs供进一步处理。首先让我们看一下sed命令:

sed 's@+@ @g;s@%@\\x@g'
Run Code Online (Sandbox Code Playgroud)

您可能更习惯用分隔符/而不是@分隔符来查看它,因为/在搜索模式和替换文本中都没有出现,所以在这里很容易做到这一点而不会复杂化。此命令等效:

sed 's/+/ /g;s/%/\\x/g'
Run Code Online (Sandbox Code Playgroud)

Like /,@是一个完美的标点符号sed

在每一行输入上:

  1. s@+@ @g( s/+/ /g)用空格替换 ( s) 的出现+。这会影响+一行 ( g)上的所有es ,而不仅仅是第一个。

  2. ; 结束操作(“命令”)并允许您在同一“脚本”中指定另一个操作。

  3. s@%@\\x@g( s/%/\\x/g) 替换 ( s) 出现的%with \x。和以前一样,它作用于所有而不只是每一行的第一行 ( g)。

    \\x\\仅代表一种\因为\具有特殊的意义sed。它的特殊含义实际上是作为您使用的字符来消除其后的另一个具有特殊含义的字符的特殊含义。所以它必须转义为\\.


现在让我们看一个xargs命令,其目的是运行printf.

xargs构造命令行。如果您运行, where是一个或多个单词,则使用从其输入中读取的附加命令行参数运行。在这种情况下,由于管道 ( ) , 的输入是 的输出。通常将其输入中的任何空格解释为表示其前后的文本构成单独的参数,但该选项使其在出现空字符时拆分参数。xargs command...command...xargscommand...xargssed|xargs-0

在您的命令的预期用途中,不会出现空字符,并且xargs只会printf %b使用一个额外的命令行参数运行,即命令的输出sed。因此,虽然在一般情况下并不等效,但在这种情况下,整个管道可能已经使用命令替换而不是这样编写xargs

printf '%b\n' "$(sed 's/+/ /g;s/%/\\x/g')"
Run Code Online (Sandbox Code Playgroud)

至于在printf这里打算做什么,正如穆鲁所说%b格式说明符消耗并打印一个参数(如%s)但会导致反斜杠转义 -sed管道左侧的命令被写入生成 - 被翻译进入他们所代表的人物

假设我运行该命令并http://foldoc.org/debugging%20by%20printf作为输入传递。我得到http://foldoc.org/debugging by printf作为输出,因为%20序列被翻译成空格。