用于在bash中转义字符串的命令

时间:2010-05-18 04:58:01

标签: bash escaping

我需要一个bash命令,将字符串转换为转义的字符串。这是一个例子:

echo "hello\world" | escape | someprog

escape命令将"hello\world"变为"hello\\\world"。然后,someprog可以按预期使用"hello\\world"。当然,这是我将要做的事情的简化示例。

5 个答案:

答案 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 格式,所以它可能不是你需要的。

另见:https://stackoverflow.com/a/27817504/401059