No meu script bash, terei duas variáveis chamadas "args1" e "args2". Cada um deles terá conteúdo como este:
Matching cluster names:
[a-z]+
[a-z]+
...
Então "args1" poderia ser:
Matching cluster names:
dev1ff
dev2ff
e "args2" poderia ser:
Matching cluster names:
dev2ff
dev3ff
Eu preciso combiná-los para produzir:
Matching cluster names:
dev1ff
dev2ff
dev3ff
Eu posso chegar perto disso com esta linha:
echo "$(echo "$args1" | grep -v "^Matching") $(echo "$args2" | grep -v "^Matching")" | sort -u
Isso produz algo mais ou menos assim:
Matching clusters:
dev1ff
dev2ff dev3ff
Os nomes reais são irrelevantes, mas o problema é que não consigo inserir uma nova linha entre o primeiro e o segundo bloco. Eu tentei várias variações de coisas nesse espaço entre os dois blocos "$(...)", mas nada funcionou.
Como a substituição de comando remove quaisquer novas linhas à direita, você obtém o espaço que tinha entre as duas substituições de comando como a única coisa que as separa. Daí o resultado.
Com qualquer um
echo
que suporte-e
, você pode usarpara colocar uma nova linha no meio em vez disso. No entanto, se seus dados tiverem barras invertidas, isso também os
echo
converteria. Para evitar isso, você pode usarprintf
assim:(A string de formato é repetida quantas vezes forem necessárias, portanto, com dois argumentos,
"%s\n"
funciona da mesma forma que%s\n%s\n
. Além disso, você pode usarprintf
em vez de deecho
qualquer maneira, consulte Por que printf é melhor que echo? )Mas você realmente não precisa das substituições de comando;
echo "$(something)"
está perto de apenas executarsomething
diretamente. Você pode agrupar os dois comandos para os quais deseja direcionarsort -u
com chaves:ou, observando que os dois greps fazem a mesma coisa, mova o grep para fora das chaves:
Nos dois acima, você pode substituir o
echo
s por algum outro comando que produza essa saída, sem precisar passar por uma variável do shell.Mas se você tiver as listas em variáveis de shell, também poderá usar
printf
para imprimir as duas ao mesmo tempo sem precisar agrupar vários comandos: