[sh] sh에서 문자열에 줄 바꿈을 어떻게 넣을 수 있습니까?

STR="Hello\nWorld"
echo $STR

출력으로 생성

Hello\nWorld

대신에

Hello
World

문자열에 줄 바꿈을하려면 어떻게해야합니까?

참고 : 이 질문은 echo에 관한 것이 아닙니다 .
나는 알고 echo -e있지만, 줄 바꿈 을 해석하는 비슷한 옵션이없는 다른 명령에 대한 인수로 문자열 (줄 바꿈 포함)을 전달할 수있는 솔루션을 찾고 있습니다 \n.



답변

해결책은 $'string'다음과 같습니다.

$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World

다음은 Bash 매뉴얼 페이지에서 발췌 한 것입니다.

   Words of the form $'string' are treated specially.  The word expands to
   string, with backslash-escaped characters replaced as specified by  the
   ANSI  C  standard.  Backslash escape sequences, if present, are decoded
   as follows:
          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \"     double quote
          \nnn   the eight-bit character whose value is  the  octal  value
                 nnn (one to three digits)
          \xHH   the  eight-bit  character  whose value is the hexadecimal
                 value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had  not
   been present.

   A double-quoted string preceded by a dollar sign ($"string") will cause
   the string to be translated according to the current  locale.   If  the
   current  locale  is  C  or  POSIX,  the dollar sign is ignored.  If the
   string is translated and replaced, the replacement is double-quoted.


답변

Echo는 90 년대에 너무나 위험해서 그 사용으로 인해 코어 덤프가 4GB 이상이어야합니다. 에코의 문제는 유닉스 표준화 프로세스가 마침내 printf유틸리티를 발명하여 모든 문제를 없애는 이유 였습니다.

따라서 문자열에 줄 바꿈을 얻으려면 :

FOO="hello
world"
BAR=$(printf "hello\nworld\n") # Alternative; note: final newline is deleted
printf '<%s>\n' "$FOO"
printf '<%s>\n' "$BAR"

그곳에! SYSV vs BSD 에코 광기 없음, 모든 것이 깔끔하게 인쇄되고 C 이스케이프 시퀀스를 완벽하게 지원합니다. 모두들 printf지금 사용 하고 뒤돌아 보지 마십시오.


답변

다른 답변을 기반으로 한 것은

NEWLINE=$'\n'
my_var="__between eggs and bacon__"
echo "spam${NEWLINE}eggs${my_var}bacon${NEWLINE}knight"

# which outputs:
spam
eggs__between eggs and bacon__bacon
knight


답변

쉘에 문제가 없습니다. 실제로 문제는 echo명령 자체에 있고 변수 보간에 큰 따옴표가 없습니다. 사용할 수는 echo -e있지만 모든 플랫폼에서 지원되는 것은 아니며 printf이제 이식성을 위해 이유 중 하나를 권장합니다.

또한 개행을 쉘 스크립트에 직접 삽입하여 (스크립트가 작성중인 경우) 다음과 같이 표시 할 수 있습니다.

#!/bin/sh
echo "Hello
World"
#EOF

또는 동등하게

#!/bin/sh
string="Hello
World"
echo "$string"  # note double quotes!


답변

-e우아하고 똑바로 깃발을 찾습니다

bash$ STR="Hello\nWorld"

bash$ echo -e $STR
Hello
World

문자열이 다른 명령의 출력이면 따옴표 만 사용합니다.

indexes_diff=$(git diff index.yaml)
echo "$indexes_diff"


답변

  1. 유일한 간단한 대안은 실제로 변수에 새 줄을 입력하는 것입니다.

    $ STR='new
    line'
    $ printf '%s' "$STR"
    new
    line
    

    예, Enter코드에서 필요한 곳에 쓰는 것을 의미 합니다.

  2. new line문자 와 동등한 몇 가지가 있습니다 .

    \n           ### A common way to represent a new line character.
    \012         ### Octal value of a new line character.
    \x0A         ### Hexadecimal value of a new line character.
    

    그러나 모든 도구는 일부 도구 ( POSIX printf )에 의해 “해석”이 필요합니다 .

    echo -e "new\nline"           ### on POSIX echo, `-e` is not required.
    printf 'new\nline'            ### Understood by POSIX printf.
    printf 'new\012line'          ### Valid in POSIX printf.
    printf 'new\x0Aline'
    printf '%b' 'new\0012line'    ### Valid in POSIX printf.

    따라서이 도구는 줄 바꿈을 사용하여 문자열을 작성해야합니다.

    $ STR="$(printf 'new\nline')"
    $ printf '%s' "$STR"
    new
    line
  3. 일부 쉘에서 시퀀스 $'는 특수 쉘 확장입니다. ksh93, bash 및 zsh에서 작동하는 것으로 알려져 있습니다.

    $ STR=$'new\nline'
  4. 물론보다 복잡한 솔루션도 가능합니다.

    $ echo '6e65770a6c696e650a' | xxd -p -r
    new
    line

    또는

    $ echo "new line" | sed 's/ \+/\n/g'
    new
    line

답변

작은 따옴표 ‘… \ n …’바로 앞에있는 $는 다음과 같이 사용되지만 큰 따옴표는 작동하지 않습니다.

$ echo $'Hello\nWorld'
Hello
World
$ echo $"Hello\nWorld"
Hello\nWorld