Você pode fazer isso em duas etapas com awk
like
awk '{$2="VAL";print}' input_file > temp_file
mv temp_file input_file
Isso dividirá o arquivo de entrada no espaço em branco, substituirá o valor na segunda coluna (use qualquer outro número diferente de 2 para coluna diferente), de modo que agora será "VAL". A menos que você o altere com OFS
, o delimitador do campo de saída será um espaço. Se você quiser algo mais você pode adicionar, dentro das aspas, algo como 'BEGIN {OFS="\ t"} ...' para definir o separador de campo de saída para o que você quiser.
Se você quiser que os valores sejam algo diferente de uma constante, você terá um pouco mais de trabalho a fazer, mas poderá adaptá-lo para isso.
Para fazer esse trabalho para a edição no seu caso, você pode fazer:
awk -F\| 'BEGIN {OFS="|";} $2~/^Orange$/ {$2="Orange_edit";} {print}' abc.txt > temp_file
mv temp_file abc.txt
Primeiro, informa awk
para dividir os campos com base em |
passando -F\|
. Em seguida, configuramos nossa saída para usar também |
para o delimitador de saída (o padrão é espaço) fazendo o primeiro bloco de código (a parte que corresponde a BEGIN, uma palavra-chave em awk
que corresponde ao início da execução) e definindo nosso OFS
ou Separador do campo de saída. Como Otheus apontou, nós poderíamos fazer {OFS=FS}
para definir o delimitador de saída para ser o mesmo que o de entrada.
Depois disso, começamos a olhar para as linhas. Comparamos o segundo campo, que é referenciado por $2
, e depois verificamos se ele corresponde a uma expressão regular usando ~
. Depois que ~
é a regex que queremos corresponder, ^
aqui significa corresponder ao início do campo, depois temos a string "Orange" e, em seguida, $
que corresponde ao final do campo. Como esta é uma string codificada em disco, Otheus também observou corretamente que poderíamos testar a igualdade de strings aqui e fazer $2=="Orange"
e pular o processamento regex, já que ele não faz nada dessa vez. Se essa correspondência for bem sucedida no bloco de código em {}
após a execução, o que salvará um novo valor no segundo campo.
Finalmente, executamos o último bloco de código {print}
para cada linha, mas quando a nossa correspondência "Orange" foi bem-sucedida, alteramos o valor do segundo campo para que ele seja impresso com nosso novo valor em vez do antigo.
awk
normalmente imprime na tela (aparentemente o mais novo gawk
tem uma opção para simplificar essa parte), então salvamos isso em um arquivo e, em seguida, movemos esse arquivo de volta para o nome original.