Estaba tratando de hacer estas pocas operaciones/comandos en una sola línea y asignarlas a una variable. Lo tengo funcionando alrededor del 90% del camino excepto por una parte.
No sabía que podías hacer esto, pero leí que puedes anidar $(...) dentro de otros $(...).... Así que estaba tratando de hacer eso para que esto funcionara, pero parece que no puedo conseguir el resto del camino.
Así que básicamente, lo que quiero hacer es:
1. Tomar la salida de un archivo y asignarlo a una variable
2. Luego, anteponga un texto al comienzo de esa salida
3. Luego agregue un texto al final de la salida
4. Y finalmente elimine las líneas nuevas y reemplácelas con el carácter "\n"...
Puedo hacer esto muy bien en varios pasos, pero me gustaría intentar que esto funcione de esta manera.
Hasta ahora he probado lo siguiente:
Mi primer intento, antes de leer sobre $ anidado (..):
MY_VAR=$(echo -n "<pre style=\"display:inline;\">"; cat input.txt | sed ':a;N;$!ba;s/\n/\\n/g'; echo -n "</pre>")Este funcionó el 99% del camino, excepto que se agregó una nueva línea entre la salida del comando cat y el último comando echo. Supongo que esto es del comando cat ya que sed eliminó todas las nuevas líneas excepto esa, ¿quizás...?
Otros intentos:
MY_VAR=$( $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo -n "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g') MY_VAR="$( echo $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g' )" MY_VAR="$( echo "$(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>")" | sed ':a;N;$!ba;s/\n/\\n/g' )"*La mayoría de estos otros se probaron con y sin las comillas dobles adicionales que rodean las diferentes partes de $(..)...
Tuve algunos otros intentos, pero tampoco tuvieron suerte ... En algunos de los otros intentos anteriores, pareció funcionar, excepto que sed NO estaba insertando la parte de reemplazo. El resultado fue correcto en su mayor parte, excepto que en lugar de ver "\n" entre líneas, solo mostraba cada una de las líneas unidas en una línea sin nada que las separara...
Estoy pensando que hay algo pequeño que me falta aquí si alguien tiene alguna idea ...?
*PS ¿Tiene Bash un nombre para la estructura $(...) ? Es difícil buscar eso en Google, ya que en realidad no busca símbolos...
No tiene necesidad de anidar sustituciones de comandos aquí.
your_var='<pre style="display:inline;">'"$(<input.txt)"'</pre>' your_var=${your_var//$'\n'/'\n'}"$(<input.txt)" se expande al contenido de input.txt , pero sin ninguna nueva línea final. (La sustitución de comandos siempre elimina los saltos de línea finales; printf '%s' "$(cat ...)" tiene el mismo efecto, aunque menos eficiente ya que requiere una subcapa, mientras que cat ... por sí solo no lo hace).${foo//bar/baz} se expande al contenido de la variable de shell llamada foo , con todas las instancias de bar reemplazadas por baz .$'\n' es sintaxis bash para una nueva línea literal.'\n' es sintaxis bash para una cadena de dos caracteres, que comienza con una barra invertida.De acuerdo, se trata de varias líneas como se implementó anteriormente, pero también es mucho más rápido y más eficiente que cualquier cosa que implique una sustitución de comando.
Sin embargo, si realmente desea una única sustitución de comando anidada, puede hacerlo:
your_var=$(printf '%s' '<pre style="display:inline;">' \ "$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \ '</pre>')printf %s combina sus argumentos sin ningún delimitador entre ellossed agrega un literal \n al final de cada línea excepto la últimatr -d '\n' elimina saltos de línea literales del archivoSin embargo, incluso este enfoque podría realizarse de manera más eficiente sin el anidamiento:
printf -v your_var '%s' '<pre style="display:inline;">' \ "$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \ '</pre>') ... que hace que printf asigne sus resultados directamente a your_var , sin necesidad de sustituir ningún comando externo (y, por lo tanto, ahorrando el gasto de la subcapa externa).