¿Cómo puedo tener una nueva línea en una cadena en sh?
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 \n
como nuevas líneas.
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.
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 printf
utilidad, 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 printf
ahora para todas sus necesidades de producción y nunca miren atrás.
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
La bandera me parece -e
elegante 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"