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

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

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

다음은 간단한 예입니다.

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

산출

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

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

답변1

네가 xargs원한다면따옴표 무시좋은 영혼 중 하나는 xargs로고를 사용하는 것입니다xargs -0

매뉴얼 페이지 옵션에서 직접

옵션 -0, --null

입력은 공백이 아닌 널 문자로 종료되며 따옴표와 백슬래시는 특별하지 않습니다(각 문자는 문자 그대로 사용됩니다). 다른 매개변수처럼 처리되는 파일 끝 문자열을 비활성화합니다. 입력에 공백, 따옴표 또는 백슬래시가 포함될 수 있는 경우 유용합니다. GNU find -print0 옵션은 이 패턴에 적합한 입력을 생성합니다.

-d옵션을 사용하는 것뿐만 아니라 구분 기호를 특정 값(예: newline -0) 으로 설정하면 xargs따옴표 등이 특별하게 처리되지 않는 GNU 시스템을 확인했습니다 .

-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$ 

답변2

GNU xargs의 경우 맨페이지에서 또 다른 해결책을 찾았습니다. 구분 기호를 "\n"으로 명시적으로 지정하는 것입니다. 그러면 따옴표의 특별한 처리가 꺼집니다.

--delimiter=delim, -d delim

입력 용어는 지정된 문자로 끝납니다. 지정된 구분 기호는 단일 문자, C 스타일 문자 이스케이프(예: \n) 또는 8진수 또는 16진수 이스케이프 코드일 수 있습니다. 8진수 및 16진수 이스케이프 코드는 printf 명령으로 이해됩니다. 멀티바이트 문자는 지원되지 않습니다. 입력을 처리할 때 따옴표와 백슬래시는 특별하지 않습니다. 입력의 모든 문자는 문자 그대로 처리됩니다.

그래서,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

산출

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

답변3

xargs매뉴얼 에서 :

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

이는 따옴표 자체가 인용된 경우 따옴표를 이스케이프 처리할 수 있음을 의미합니다.

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

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

답변4

여기서 또 다른 해결책을 찾았습니다https://stackoverflow.com/a/17468560/1795821이스케이프된 따옴표를 사용하는 것이 좋습니다 sed.

예를 들어:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'

관련 정보