Estou fazendo grep e sed e recebo 2 linhas de um arquivo no qual estou interessado. Como posso obter essas linhas em uma única linha que termina com o novo caractere de linha?
Agora estou recebendo:
pattern1
pattern2
Eu gostaria de receber pattern1 pattern2 \n
printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Respostas:
paste
:Isso diz: "leia uma linha do stdin (o primeiro
-
), leia outra linha do stdin (o segundo-
) e junte-os a um espaço"uma técnica específica do bash:
ref: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile
fonte
- -
? O comando é assim?paste
como você deseja que ele processe a entrada. 2 de cada vez. Adicione mais para fazer 3 de cada vez.seq 10 | paste -d " " - -
.Vou colocar três versões diferentes métodos seguidos
AWK
SED
TR
E há muito mais.
fonte
tr
solução vai engolir a nova linha terminando, assim você pode querer adicionar; echo
a essevocê pode fazê-lo usando o shell script ou na linha de comando, basta colocar a saída do comando em uma variável e depois
echo
:fonte
*
ou?
) no resultado, os valores poderão mudar.$()
em vez .. e usando printfprintf '%s\n' "$x"
printf '%s\n' "$x"
NÃO remova a nova linha "interna".Com
sed
, você pode fazer isso:N;
mandased
adicionar a próxima linha ao espaço do padrão, agora agorased
está trabalhando com as duas linhas.s/\n/ /
substitui o caractere de nova linha por um espaço, "mesclando" as duas linhas.fonte
Uma maneira simples, canalize a saída para
xargs
:Isso funciona apenas com saída pequena, porque é limitado pelo máximo de caracteres por linha de comando. O maior valor depende do sistema, você pode obter esse valor usando
getconf ARG_MAX
.fonte
O IFS ficará feliz em comê-lo, se quiser.
fonte
envolva seu sed / grep em backticks
quando seu comando original era:
seu novo comando seria:
Não coloca os espaços entre as linhas, mas você sempre pode prender em outro tubo de sed:
fonte