xargs가 입력에서 따옴표를 제거하는 이유는 무엇입니까?


25

xargs가 입력 텍스트에서 따옴표를 제거하는 이유는 무엇입니까?

다음은 간단한 예입니다.

echo "/Place/='http://www.google.com'" | xargs echo

출력

/Place/=http://www.google.com

이 문제를 해결할 방법이 있습니까? (xargs -0은 도움이되지 않습니다)


1
xargs따옴표와 백 슬래시를 스펙의 일부로 특별히 취급합니다 . xargs대신 하려는 일을 게시하십시오 .
jw013

3
xargs -0나를 위해 여기에서 작동합니다 ... 왜 도움이되지 않습니까?
derobert

답변:


10

로부터 xargs수동 :

입력 인수에 공백 또는 가로 탭이 포함되도록하려면 큰 따옴표 또는 아포스트로피로 묶으십시오. 인수에 큰 따옴표 ( ") 가 포함되어 있으면 아포스트로피로 인수를 묶어야합니다. 반대로, 인수에 아포스트로피 ( ') 가 포함되어 있으면 인수를 큰 따옴표로 묶어야합니다. \문자 앞에 백 슬래시 ( )를 넣어 문자가 가질 수있는 특수한 의미 (예 : 공백 문자 또는 따옴표)를 무시하도록 xargs에 지시 할 수 있습니다.

즉, 따옴표 자체를 인용하면 따옴표를 이스케이프 할 수 있습니다.

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

작동하지만 작동 echo /Place/=\'http://www.google.com\' | xargs echo하지 않습니다.


1
다운 투표에 반대하는 것은 없지만 그 이유에 대한 의견은 도움이 될 것입니다 :-)
Matteo

3
입력 배관은 어떻게됩니까? 출력하는 스크립트가있는 경우 "/Place/='http://www.google.com'"어떻게 올바르게 이스케이프 처리 할 수 ​​있습니까?
Roger Filmyer

1
@RogerFilmyer your_script | 병렬 --shellquote | ...
Ole Tange

19

당신이 원하는 경우 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$ 


7

맨 페이지에서 다른 해결책을 찾았습니다. 구체적으로 구분 기호를 '\ 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'

이것은 GNU xargs또는 호환되는 것을 의미합니다
Stéphane Chazelas

또한 공간과 탭이 구분 기호로 인식되는 것을 막습니다 (아마도 OP의 경우와 마찬가지로).
Stéphane Chazelas

Balman은 비슷한 솔루션 ( 실제로는 @imz )을 제공했지만 ksh93 $'...'모든 쉘 구현에서 찾을 수없는 인용 연산자를 사용 하지 않기 때문에 다소 우수 합니다.
Stéphane Chazelas

4

따옴표를 이스케이프 처리 하는 방법을 제안하는 다른 솔루션을 /programming//a/17468560/1795821 에서 발견했습니다 sed.

예를 들면 다음과 같습니다.

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.