Como posso fazer com que o awk imprima correspondências e não correspondências?

Como posso fazer com que o awk imprima correspondências e não correspondências?

Basicamente, tudo o que quero fazer é alterar as saídas se a entrada corresponder a um filtro, mas a parte que está sendo alterada não é a que está sendo filtrada (ou eu usaria sed). O problema até agora é que o meu awkestá apenas exibindo as linhas alteradas.

Exemplo rápido, coloque isso em test.txt:

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk

Se eu usar o código:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt

Eu recebo:

orange beet pear cow~milk
orange melon cherry cow~milk

Quando eu prefiro receber:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk

Vejo que você pode fazer isso ||com o awk, mas não consegui descobrir como encaixar isso no gsub acima.

Para apreciação do bônus, o que eu realmente gostaria de fazer é adicionar cor em vez de ~, mas isso quebra totalmente, ou seja

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt

me dá um erro sobre \não ser o fim da linha.

Responder1

Para cor, você precisa especificar o caractere ESC real (não a forma de escape \e). O valor é hex \x1Bou octal \033. Os scripts a seguir colorem o traço -e imprimem todas as linhas de entrada

awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"

sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"

Responder2

Para imprimir cada linha depois de modificar apenas algumas, adicione uma condição separada que sempre seja avaliada como verdadeira, como ( 1):

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

Você também poderia ter {print}explicitamente:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

Lembre-se de que cada instrução awk consiste em uma condição e uma cláusula de instrução:

condition {statements}

Mas cada um deles é opcional, se você não incluir{statements}, então {print}é usado. Se você não incluircondition, então 1é usado.

informação relacionada