¿Cómo puedo tener una nueva línea en una cadena en sh?

Resuelto Juan A. Navarro asked hace 14 años • 13 respuestas

Este

STR="Hello\nWorld"
echo $STR

produce como salida

Hello\nWorld

en lugar de

Hello
World

¿Qué debo hacer para tener una nueva línea en una cadena?

Nota: esta pregunta no se trata de echo . Lo sé echo -e, pero estoy buscando una solución que permita pasar una cadena (que incluye una nueva línea) como argumento para otros comandos que no tienen una opción similar para interpretarlos \ncomo nuevas líneas.

Juan A. Navarro avatar Jun 09 '10 20:06 Juan A. Navarro
Aceptado

Si está utilizando Bash, puede utilizar barras invertidas dentro de un archivo $'string'. Por ejemplo, agregando \n:

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

Huellas dactilares:

Hello
World

Si está utilizando prácticamente cualquier otro shell, simplemente inserte la nueva línea tal como está en la cadena:

STR='Hello
World'

Bash reconoce otras secuencias de escape de barra invertida en la $''cadena. Aquí hay un extracto de la página del manual de 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.
amphetamachine avatar Jul 05 '2010 22:07 amphetamachine

Echo es tan noventero y está tan plagado de peligros que su uso debería dar lugar a volcados de memoria de no menos de 4 GB. En serio, los problemas de echo fueron la razón por la que el proceso de estandarización de Unix finalmente inventó la printfutilidad, eliminando todos los problemas.

Entonces, para obtener una nueva línea en una cadena, hay dos maneras:

# 1) Literal newline in an assignment.
FOO="hello
world"
# 2) Command substitution.
BAR=$(printf "hello\nworld\n") # Alternative; note: final newline is deleted
printf '<%s>\n' "$FOO"
printf '<%s>\n' "$BAR"

¡Allá! No hay locura de eco SYSV vs BSD, todo se imprime cuidadosamente y es totalmente portátil y compatible con secuencias de escape C. Todos, utilicen printfahora para todas sus necesidades de producción y nunca miren atrás.

Jens avatar May 16 '2012 12:05 Jens

Lo que hice en base a las otras respuestas fue

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
zvezda avatar Dec 01 '2012 11:12 zvezda

La bandera me parece -eelegante y sencilla.

bash$ STR="Hello\nWorld"

bash$ echo -e $STR
Hello
World

Si la cadena es el resultado de otro comando, solo uso comillas

indexes_diff=$(git diff index.yaml)
echo "$indexes_diff"
Simon Ndunda avatar Jun 05 '2015 07:06 Simon Ndunda