我需要一个bash命令,它可以将字符串转换为转义的内容。下面是一个例子:
echo "hello\world" | escape | someprog
其中,escape命令使"hello\world"
进入"hello\\\world"
。然后,某个程序就可以像它期望的那样使用"hello\\world"
。当然,这是我真正要做的一个简化的例子。
发布于 2010-05-18 17:35:46
在Bash中:
printf "%q" "hello\world" | someprog
例如:
printf "%q" "hello\world"
hello\\world
这也可以通过变量使用:
printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world
发布于 2010-05-18 14:40:40
纯Bash,使用参数替换:
string="Hello\ world"
echo ${string//\\/\\\\} | someprog
发布于 2020-12-17 14:54:24
它可能不是您想要的,因为它不是任何人的系统上的标准命令,但是由于我的程序在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;
}
https://stackoverflow.com/questions/2854655
复制相似问题