perl -pi.BAK -aF'/(\h*[#=]\h*)/,$_,4' -le '
$F[4] = "archive";
$_ = join $,, @F[2..$#F] if /^\h*#\h*wal_level\h*=/;
' /var/lib/pgsql/data/postgresql.conf
Строка разбита на поля @F
, а также включены разделители. Параметр 4 в опции разделения полей -F
будет ограничивать количество полей до этого. Поля, начиная с 3-го, объединяются вместе с использованием пустого пространства, которое является значением по умолчанию для OFS = $,
Вы можете использовать расширение параметра, если это то, что вы имеете в виду. Но это не очень читабельно:
while read a; do
# comments are for the first line A#B#C
f1f2=${a%#*} # remove suffix #C -> A#B
f1=${f1f2%#*} # remove suffix #B -> A
f2=${f1f2#*#} # remove prefix A# -> B
f3=${a##*#} # remove longest prefix: A#B# -> C
echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file
Проще установить переменную внутреннего разделителя полей в IFS=#
и разделить каждую строку на три переменные:
while IFS=# read f1 f2 f3; do
echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file
В ksh также можно использовать массивы:
while IFS='#' read -A arr; do
echo "${#arr[@]} items, second item: ${arr[1]}"
done < file
read -A
работает и в Zsh, но индексы массива основаны на -. Bash read -a
работает аналогично ksh.