입력 줄을 인용하는 필터 명령이 있는지 궁금합니다.
따라서 배관할 때:
line number 1
line number 2
line number 3
그것에 대해 당신은 다음을 얻습니다:
"line number 1"
"line number 2"
"line number 3"
세 개가 아닌 하나의 매개 변수 로 처리 xargs
되도록 라인 스트림을 파이프하려면 이 명령이 필요합니다 . 나는 그것이 다른 용도로 많이 사용된다고 확신합니다.xargs
line number 1
그런 명령이 있나요? 이것을 무엇이라고 부르나요?
답변1
이를 위해 특별히 설계된 도구는 없지만 많은 다중 도구가 이 작업을 수행할 수 있습니다.
sed 's/^/"/;s/$/"/'
perl -pe 's/^/"/;s/$/"/'
또는perl -lne 'print "\"$_\""'
awk '{printf "\"%s\"\n",$0}'
while read -r line; do printf '"%s"\n' "$line"; done
(이 모든 것은 줄에 큰따옴표가 포함되어 있지 않다고 가정합니다. 포함된 경우 중단됩니다 xargs
.)
답변2
Perl 기능을 제공하겠습니다 quotemeta
. 아니요상당히당신이 묻는 것은 공백을 따옴표로 바꾸는 대신 공백을 이스케이프 처리하기 때문입니다.
그러나 부수적인 이점으로 다음을 처리할 수도 있습니다.다른특수 문자(예: *
):
perl -nle 'print quotemeta'
(또는 댓글에서 언급했듯이 더 짧은 형식입니다 perl -ple '$_=quotemeta'
.)
그러면 귀하의 라인이 다음과 같이 바뀔 것입니다:
line\ number\ 1
line\ number\ 2
line\ number\ 3
동일한 결과를 가져야 하며 다음을 처리해야 합니다.
Line number \"`rm -rf *`\"
비슷한 장난도 있어요 :)
답변3
GNU 시스템이라면 --delimiter
매개변수를 살펴보세요 xargs
. 입력이 줄바꿈으로 구분되므로 인용에 전혀 의존하거나 다른 도구를 사용할 필요가 없습니다.
cat files.txt | xargs --delimiter=\\n printf "<%s>"
여기에는 files.txt
귀하의 입력이 포함됩니다.
line number 1
line number 2
line number 3
출력은 다음과 같습니다.
<line number 1><line number 2><line number 3>
참고: 입력을 파일에 저장하고 사용할 필요는 없습니다 cat
. 물론 다른 프로그램에서 직접 파이프할 수도 있습니다. cat
이와 같은 독립 실행형 예제를 만들 때 매우 일반적이고 실용적이기 때문에 예제에서 이를 사용했습니다 .
더 나은( xargs
그리고 매뉴얼에서 권장하는) 출력 프로그램에서 \0
개행 문자 대신 NUL()로 항목을 구분하고 해당 --null
옵션을 대신 사용하는 것입니다 --delimiter
. 그러나 입력 문자열 자체에 개행 문자가 포함되지 않는 한 위 방법을 따르면 됩니다. 괜찮아 질거야.
답변4
GNU 시스템에서 쉘 지원 $'...'
:
xargs -d$'\n' printf '%s\n' <<\IN
line number 1
line number 2
line number 3
IN
표준 도구를 사용하십시오.
:|paste -d'"' - file - | xargs printf '%s\n'
두 가지 모두 줄에 포함된 따옴표가 없다고 가정합니다.