Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

878
Visualizações
Bash Script - Comandos $(..) anidados - No funciona correctamente

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...

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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.
  • Por lo tanto, uniendo todo esto, primero genera una sola cadena con el prefijo, el contenido del archivo y el sufijo; luego reemplaza las líneas nuevas literales dentro de esa cadena combinada con secuencias de dos caracteres '\n'.

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>')
  • El printf %s combina sus argumentos sin ningún delimitador entre ellos
  • La operación sed agrega un literal \n al final de cada línea excepto la última
  • La operación tr -d '\n' elimina saltos de línea literales del archivo

Sin 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).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda