Более надежный способ сawk
скриптом:
awk '{ if (/foo/) gsub(/foo/, "bar"); else $0 = $0 "baz" }1' file
Или даже короче:
awk '{ if (!gsub(/foo/, "bar")) $0 = $0 "baz"; }1' file
При использовании функции gsub для изменения содержимого $0 (без замены определенного поля )вывод не будет переформатирован:
df -h | awk '$5 ~ /[8-9][0-9]|100/ {gsub($5,"\033[1;31m"$5"\033[0m")}1'
Это работает только в том случае, если $5 встречается только один раз в строке с предположительно имеет место в данном примере.
GNU awk имеет расширение для разделения ():, оно будет хранить все поля в одном массиве, а все фактические разделители полей (, совпадающие с используемым RE ), в другом массиве. Таким образом, вы можете исправить значение [5], чтобы включить окраску, а затем воссоздать выходную строку в цикле, чередуя поля и фактические разделители.
https://www.gnu.org/software/gawk/manual/gawk.html#String-Functionsи прокрутите вниз до split()