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 awk
está 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 \x1B
ou 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.