concatenação de dois comandos em um único comando

1
while read pos; do
string1= echo $pos | cut -c 20-38
string2="=$pos"
string3="$string1 $string2"
echo "$string3"
done < file

Este é o código do meu script. Eu quero exibir a saída em uma única linha, mas a saída vem em linhas diferentes.

pos = abcdefghi1234567890QWERTYUXY.tar.gz
string1 = 1234567890QWERTYUXY
string2 = abcdefghi1234567890QWERTYUXY.tar.gz

Saída desejada:

1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz

Mas as duas cadeias são exibidas em duas linhas diferentes. Quero exibir a saída em uma linha.

    
por Yi Jiang 23.02.2011 / 11:01

3 respostas

3

Um casal muda e deve funcionar:
Geralmente, quando você usa uma variável como você fez no eco, a variável original permanece como estava, então o uso da string 2 é totalmente desnecessário. Além disso, eu tenho o hábito de usar chaves para {incluo} variáveis para que elas possam ser referenciadas dentro do texto, as chaves funcionam para delimitar o nome da variável, basta colocar o sinal de dólar na frente (exemplo a seguir). >

1- Ao definir pela primeira vez a string1, não coloque espaços em nenhum dos lados do sinal de igual.
2- ao atribuir os resultados de um comando a uma variável, você tem que forçar o comando a ser executado, os ticks de volta única (o caracter à esquerda da tecla nº 1 nos teclados dos EUA) em torno do comando fazem isso.
3- observe o número de caracteres que você cortou, seu código e exemplo não concordam. Então essa linha deve se parecer com:

string1='echo $pos | cut -c 20-38'

A outra coisa é quando você define um valor de outro, não inclua o sinal de igual extra. Então, o código para definir string2 deve ser semelhante:

string2="$pos"

Acredito que o seguinte fará o que você solicitar, ajustei a contagem de caracteres para fornecer a saída do seu exemplo:

O "arquivo" de entrada do meu teste continha:
abcdefghi1234567890QWERTYUXY.tar.gz

E meu roteiro é:

 #!/bin/sh
while read pos; do
string1='echo ${pos} | cut -c 10-28'
echo "${string1} ${pos}"
done < file

A saída parece:
1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz

Qual é exatamente o que eu acredito que você está pedindo.

    
por hey_gary 24.07.2012 / 07:23
3

Você pode canalizar a saída por meio de sed , principalmente:

echo "$string3" | sed ':a;N;$!ba;s/\n/ /g'

Todo o crédito para Zsolt Botykai no StackOverflow para sua resposta

    
por Oli 23.02.2011 / 12:51
2

O Bash tem uma poderosa substituição de variáveis que evita que você tenha que criar variáveis extras e canalizar para outro comando. Talvez tente algo assim

while read pos; do
  echo "${pos} ${pos%.tar.gz}"
done

A forma geral é ${var%Pattern} - Remova de $ var a parte mais curta de $Pattern que corresponde ao final de $var .

link

    
por Michael Sandman 21.11.2016 / 20:55