我需要一个bash命令,将字符串转换为转义的字符串。这是一个例子:
echo "hello\world" | escape | someprog
escape命令将"hello\world"
变为"hello\\\world"
。然后,someprog可以按预期使用"hello\\world"
。当然,这是我将要做的事情的简化示例。
答案 0 :(得分:131)
在Bash中:
printf "%q" "hello\world" | someprog
例如:
printf "%q" "hello\world"
hello\\world
这也可以通过变量使用:
printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world
答案 1 :(得分:7)
Pure Bash,使用参数替换:
string="Hello\ world"
echo ${string//\\/\\\\} | someprog
答案 2 :(得分:0)
您可以使用perl替换各种字符,例如:
$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world
根据转义的性质,您可以链接多个调用以转义正确的字符。
答案 3 :(得分:0)
这可能不是您想要的,因为它不是任何人系统上的标准命令,但是由于我的程序在POSIX系统(如果已编译)上应该可以正常工作,因此无论如何我都会提到它。如果您有能力在有问题的计算机上编译或添加程序,它应该可以工作。
我已经使用它大约一年了,但是可能无法处理某些极端情况。最具体地说,我不知道使用字符串中的换行符会如何处理。 \\n
的情况可能需要添加。此字符列表不具有权威性,但我认为它涵盖了所有其他内容。
我专门将此代码编写为“帮助程序”,因此可以为scp
命令之类的程序做包装。
它可能也可以实现为shell函数
因此,我提出escapify.c
。我这样使用它:
scp user@host:"$(escapify "/this/path/needs to be escaped/file.c")" destination_file.c
请注意:我将此程序供个人使用。它还将(可能是错误的)假设,如果给出多个参数,则应仅打印一个未转义的空间并继续。这意味着它可以用来正确地传递多个转义的参数,但是某些人可能会将其视为有害的行为。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char c='\0';
int i=0;
int j=1;
/* do not care if no args passed; escaped nothing is still nothing. */
if(argc < 2)
{
return 0;
}
while(j<argc)
{
while(i<strlen(argv[j]))
{
c=argv[j][i];
/* this switch has no breaks on purpose. */
switch(c)
{
case ';':
case '\'':
case ' ':
case '!':
case '"':
case '#':
case '$':
case '&':
case '(':
case ')':
case '|':
case '*':
case ',':
case '<':
case '>':
case '[':
case ']':
case '\\':
case '^':
case '`':
case '{':
case '}':
putchar('\\');
default:
putchar(c);
}
i++;
}
j++;
if(j<argc) {
putchar(' ');
}
i=0;
}
/* newline at end */
putchar ('\n');
return 0;
}
答案 4 :(得分:0)
前段时间添加了一个 bash buitin:
echo "hello\\world" | ( read -rsd '' x; echo ${x@Q} )
'hello\world'
转义的输出是 bash 格式,所以它可能不是你需要的。