답변:
로부터 xargs
수동 :
입력 인수에 공백 또는 가로 탭이 포함되도록하려면 큰 따옴표 또는 아포스트로피로 묶으십시오. 인수에 큰 따옴표 (
"
) 가 포함되어 있으면 아포스트로피로 인수를 묶어야합니다. 반대로, 인수에 아포스트로피 ('
) 가 포함되어 있으면 인수를 큰 따옴표로 묶어야합니다.\
문자 앞에 백 슬래시 ( )를 넣어 문자가 가질 수있는 특수한 의미 (예 : 공백 문자 또는 따옴표)를 무시하도록 xargs에 지시 할 수 있습니다.
즉, 따옴표 자체를 인용하면 따옴표를 이스케이프 할 수 있습니다.
$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'
작동하지만 작동 echo /Place/=\'http://www.google.com\' | xargs echo
하지 않습니다.
"/Place/='http://www.google.com'"
어떻게 올바르게 이스케이프 처리 할 수 있습니까?
당신이 원하는 경우 xargs
에 따옴표를 무시 의 사용 될 수있는 좋은 soultion 중 하나를 xargs
플래그 xargs를 -0
매뉴얼 페이지에서 직접 옵션
옵션 -0, --null
입력 항목은 공백 대신 널 문자로 종료되며 따옴표와 백 슬래시는 특수하지 않습니다 (모든 문자가 문자 그대로 사용됨). 다른 인수와 같이 취급되는 파일 문자열의 끝을 비활성화합니다. 입력 항목에 공백, 따옴표 또는 백 슬래시가 포함될 수있는 경우에 유용합니다. GNU find -print0 옵션은이 모드에 적합한 입력을 생성합니다.
나는 함께 (줄 바꿈 같은) 특정 값으로 구분 기호를 설정하는 GNU 시스템을 점검 한 -d
옵션 (그리고 그냥하는 -0
)도 원인이 xargs
등 특수 따옴표를 치료하지 :
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$
대신 GNU Parallel을 사용할 수 있습니다.
$ echo "/Place/='http://www.google.com'" | parallel echo
/Place/='http://www.google.com'
그런 다음 인용을 직접 할 필요는 없습니다.
자세히 알아보기 : https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
맨 페이지에서 다른 해결책을 찾았습니다. 구체적으로 구분 기호를 '\ n'으로 지정하십시오. 따옴표에 대한 특수 처리가 해제됩니다.
--delimiter = delim, -d delim
입력 항목은 지정된 문자로 종료됩니다. 지정된 구분 기호는 단일 문자, \ n과 같은 C 스타일 문자 이스케이프 또는 8 진수 또는 16 진수 이스케이프 코드 일 수 있습니다. 8 진 및 16 진 이스케이프 코드는 printf 명령에 대한 것으로 이해됩니다. 멀티 바이트 문자는 지원되지 않습니다. 입력을 처리 할 때 따옴표와 백 슬래시는 특별하지 않습니다. 입력의 모든 문자는 문자 그대로 사용됩니다.
그래서,
echo "/Place/='http://www.google.com'" | xargs -d'\n' echo
출력
/Place/='http://www.google.com'
xargs
또는 호환되는 것을 의미합니다
따옴표를 이스케이프 처리 하는 방법을 제안하는 다른 솔루션을 /programming//a/17468560/1795821 에서 발견했습니다 sed
.
예를 들면 다음과 같습니다.
sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
xargs
따옴표와 백 슬래시를 스펙의 일부로 특별히 취급합니다 .xargs
대신 하려는 일을 게시하십시오 .