Поскольку вы сказали "только в bash", вот упрощенное решение c all- bash.
$: while IFS=, read name number country
> do case "$name" in
> abc) echo "$name,00070,$country" ;;
> *) echo "$name,$number,$country" ;;
> esac
> done < infile
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia
Хотя лучше просто использовать sed
-
$: sed '/^abc,/s/,[^,]*,/,00070,/' in
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia
Скрипт вообще не нужен.
Объяснено:
/^abc/
говорит "для каждой записи, которая начинается (^
) с abc
, выполните следующее ...
s
объявляет замена первой части второй частью.
,[^,]*,
(первая часть) говорит, что найти запятую, за которой следует любое количество не запятых (^
внутри [...]
означает «не эти») , затем еще одна запятая
, затем во втором разделе говорится, чтобы заменить все, что мы нашли в первом разделе, на литерал ,00070,
.
Если вы хотите написать это как скрипт, вы можете передать в строках триггера и замены ...
#! /usr/bin/bash
sed "/^$1,/s/,[^,]*,/,$2,/" $3
Затем запустите его:
$: ./tst abc 00070 infile
abc,00070,india
dfg,78910,china
abc,00070,japan
abc,00070,australia
$: ./tst dfg 987654321 infile
abc,123456,india
dfg,987654321,china
abc,893948,japan
abc,892389,australia
Затем вы можете начать добавлять такие вещи, как проверка ошибок, ограничения для значений, непозиционные аргументы с getopts
, et c ... но здесь у вас есть быстро работающий шаблон.
(Если у вас есть весь файл имени / номера для изменения в целевом файле, тогда ищите ассоциативные массивы - don ' сделать это как вложенный l oop, который редактирует весь файл один раз для каждой записи в другой файл. Это можно сделать за один проход.)