Чтение значения из файла и последующее изменение переменной, содержащей это значение, не изменит значение в файле.
Вместо этого вам придется определить, какие значения необходимо изменить, изменить их, а затем вывести полный файл (, включая измененные значения ), в новый файл. Затем этот новый файл можно переместить под исходное имя, заменив старый файл.
Кроме того, разбора текста в оболочке обычно следует избегать . Вместо этого рассмотрите возможность использования чего-то вроде awk
для этого:
awk -F '\t' 'BEGIN { OFS=FS }
$4 == "No" { print "Congrats, here is your gift" >"/dev/stderr" }
{ $4 = "Yes"; print }' file.txt >newfile.txt
Это будет читать файл построчно, и всякий раз, когда в четвертом столбце указано No
, выводится текст Congrats, here is your gift
.
Затем для каждой строки четвертый столбец безоговорочно устанавливается в Yes
до того, как будет напечатана вся строка.
Как программа написана и запущена выше, в терминале появится сообщение Congrats...
(оно записывается в стандартный поток ошибок )в то время как обновленное содержимое файла будет записано в новый файл называется newfile.txt
.
Блок BEGIN
в начале кода просто устанавливает разделитель полей вывода, OFS
, на то же значение, что и разделитель полей ввода, FS
, который устанавливается на символ табуляции в командной строке. используя -F '\t'
.