Inserir palavra entre cada linha correspondente

3

Eu estou querendo saber como posso verificar o final do arquivo no loop while. O que estou fazendo aqui é se houver alguma palavra, como "abacaxi", "maçã", "cebola", "laranja", ou etc, eu quero encontrar linhas incluindo palavras específicas usando o comando grep e fazer algum comentário "janela". Por exemplo, se eu usar grep 'a' 'file' , ele encontrará "abacaxi", "maçã" e "laranja". Então, finalmente, quero imprimir como "abacaxi, janela, maçã, janela, laranja, janela", algo assim. Então, eu gostaria de fazer alguma condição no while ou no loop. Qualquer ajuda será muito apreciada.

edite: Entradas de Amostra

apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion

Resultados esperados ao usar o comando grep - > grep 'a' 'file name'

apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
    
por GideokSeong 31.05.2018 / 20:43

3 respostas

6

Usando o awk

Para imprimir window após cada linha que corresponda a a :

$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Como funciona

/a/{...} seleciona as linhas que correspondem à regex a . Para cada linha, os comandos nas chaves são executados.

print imprime a linha que contém a correspondência

print "window" imprime window .

Usando sed

$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Como funciona

-n diz ao sed para não imprimir a menos que explicitamente como para.

/a/{...} seleciona as linhas que correspondem à regex a . Para essas linhas, os comandos nas chaves são executados.

s/$/\nwindow/ adiciona uma nova linha e window após o final da linha atual.

p imprime.

    
por 31.05.2018 / 20:56
3
$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Isso usa o comando grep original e, em seguida, acrescenta a palavra window após cada linha resultante usando o comando a ("append") no GNU sed (o padrão sed requer uma nova linha após o \ e no final do texto inserido, mas o GNU sed é um pouco mais indulgente).

Alternativamente, usando apenas o GNU sed :

$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

A expressão sed imprime todas as linhas que contêm a letra a e, em seguida, anexa a string window .

    
por 31.05.2018 / 21:02
2

O modo shell pode ser usado da seguinte forma:

while IFS= read -r line || [ -n "$line" ]; do
    case "$line" in
        *a*) printf "%s\nwindow\n" "$line"
    esac
done < input.txt

Isso combina o loop típico while IFS= read -r line; do...done < file.txt para a leitura de arquivos, a instrução case para corresponder às linhas que contêm caracteres específicos e printf para imprimir essa linha extra window .

    
por 31.05.2018 / 22:46