programing

bash의 문자열을 이스케이프하는 명령

minimums 2023. 5. 23. 21:45
반응형

bash의 문자열을 이스케이프하는 명령

문자열을 이스케이프된 것으로 변환하는 bash 명령이 필요합니다.다음은 예입니다.

echo "hello\world" | escape | someprog

이스케이프 명령이 실행되는 위치"hello\world"안으로"hello\\\world"그러면, 어떤 프로그램은"hello\\world"예상대로물론, 이것은 제가 실제로 무엇을 할 것인지에 대한 단순화된 예입니다.

배시에서:

printf "%q" "hello\world" | someprog

예:

printf "%q" "hello\world"
hello\\world

이는 변수를 통해서도 사용할 수 있습니다.

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

순수 Bash, 매개 변수 대체 사용:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

내장된 배시${…@Q}확장이 얼마 전에 추가되었습니다.

echo "hello\\world" | ( read -rsd '' x; echo ${x@Q} ) 
'hello\world'

이스케이프된 출력은 bash 형식이므로 필요한 출력이 아닐 수 있습니다.

참고 항목: https://stackoverflow.com/a/27817504/401059

그것은 당신이 원하는 것이 아닐 수도 있습니다. 왜냐하면 그것은 누구의 시스템에서도 표준 명령이 아니기 때문입니다. 하지만 제 프로그램은 POSIX 시스템에서 잘 작동할 것이기 때문입니다(컴파일된 경우).문제의 컴퓨터에서 프로그램을 컴파일하거나 추가할 수 있는 기능이 있으면 작동해야 합니다.

지금까지 1년 정도 문제없이 사용했는데, 엣지 케이스가 일부 처리가 안 될 수도 있습니다.가장 구체적으로, 나는 그것이 문자열의 새로운 줄에 어떤 영향을 미칠지 모릅니다; 사례.\\n추가해야 할 수 있습니다.이 등장인물 목록은 권위적이지는 않지만, 다른 모든 것을 포함한다고 생각합니다.

나는 특별히 이것을 '도우미' 프로그램으로 써서 다음과 같은 것들을 위한 포장지를 만들 수 있었습니다.scp명령을 실행합니다.

셸 기능으로도 구현될 수 있습니다.

그러므로 나는 발표합니다.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;
}

perl을 사용하여 다음과 같은 다양한 문자를 바꿀 수 있습니다.

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

이스케이프의 특성에 따라 여러 통화를 체인으로 연결하여 올바른 문자를 이스케이프할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2854655/command-to-escape-a-string-in-bash

반응형