sed -e '未终止's'命令

sed -e '未终止's'命令

我试图从Figlet 生成的一些文本中转义所有反斜杠。这是我到目前为止所拥有的。

figlet -f $font -t "Foo Bar" | sed -e "s|\\|\\\\|g"

由于某种原因这不起作用,但它确实有效。

figlet -f $font -t "Foo Bar" | sed -e "s| |X|g"

我是否误解了 sed 在这里的工作原理?我也找不到关于此的类似帖子。

答案1

双引号不能保护 内的反斜杠sed -e "s|\\|\\\\|g"免受 shell 尝试解析它们的影响。如果您使用一个更简单的示例,您可以更容易地看到这一点:

$ echo 'blah\blah'| sed -e "s|\\|blah|g"
sed: -e expression #1, char 10: unterminated `s' command

$ echo 'blah\blah'| sed -e 's|\\|blah|g'
blahblahblah

如果您想使用您的第一种形式,sed您需要将其切换为单引号而不是双引号。

$ figlet -t "Foo Bar" | sed -e 's|\\|\\\\|g'
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

如果必须使用双引号,则需要更多反斜杠来转义 shell,并且sed

$ figlet -t "Foo Bar" | sed -e "s|\\\|\\\\\\\|g"
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

相关内容