입력 줄을 인용하는 Unix 명령이 있습니까?

입력 줄을 인용하는 Unix 명령이 있습니까?

입력 줄을 인용하는 필터 명령이 있는지 궁금합니다.

따라서 배관할 때:

line number 1
line number 2
line number 3

그것에 대해 당신은 다음을 얻습니다:

"line number 1"
"line number 2"
"line number 3"

세 개가 아닌 하나의 매개 변수 로 처리 xargs되도록 라인 스트림을 파이프하려면 이 명령이 필요합니다 . 나는 그것이 다른 용도로 많이 사용된다고 확신합니다.xargsline 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'

두 가지 모두 줄에 포함된 따옴표가 없다고 가정합니다.

관련 정보