Como posso “mesclar” padrões em uma única linha?

10

Estou fazendo grep e sed e recebo duas linhas de um arquivo no qual estou interessado. Como posso obter essas linhas em uma única linha que termina com o caractere de nova linha?
Agora estou chegando:

pattern1  
pattern2  

Gostaria de receber pattern1 pattern2 \n

    
por Jim 22.08.2014 / 16:23

7 respostas

7

paste :

{...pipeline...} | paste -d " " - -

Isso diz: "leia uma linha de stdin (o primeiro - ), leia outra linha de stdin (o segundo - ) e junte-os com um espaço"

uma técnica específica da bash:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

ref: link

    
por 22.08.2014 / 16:27
6

Vou colocar três versões diferentes métodos seguidos

AWK

printf %s\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\n pattern1 pattern2 | tr '\n' ' '; echo

E há muitos mais.

    
por 22.08.2014 / 17:02
2

você pode fazer isso usando o shell script ou na linha de comando, basta colocar a saída do comando em uma variável então echo it:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2
    
por 22.08.2014 / 16:37
2

Com sed , você pode fazer isso:

<your previous commands> | sed '{N; s/\n/ /}'
  • N; informa sed para adicionar a próxima linha no espaço de padrão, então agora sed está trabalhando com as duas linhas.
  • s/\n/ / substitui o caractere de nova linha por um espaço, "unindo" as duas linhas juntas.
por 22.08.2014 / 17:04
2

De uma maneira simples, envie a saída para xargs :

$ echo -e 'a\nb' | xargs
a b

Isso só funciona com pequena saída, 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 .

    
por 22.08.2014 / 17:59
1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

A IFS ficará feliz em comê-lo, se quiser.

    
por 23.08.2014 / 11:42
-1

envolva seu sed / grep em backticks

quando seu comando original era:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

seu novo comando seria:

'grep -i 'foo' mylog.log | sed 's/bar/baz/gi''

Não obtém os espaços entre as linhas, mas você pode sempre adicionar outro canal sed:

 | sed 's/$/ /'
    
por 22.08.2014 / 23:15