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'