Разделить строку с разделителями с помощью подстановки переменных

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 = $,

.
0
15.07.2019, 19:35
2 ответа

Вы можете использовать расширение параметра, если это то, что вы имеете в виду. Но это не очень читабельно:

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
1
28.01.2020, 02:22

В ksh также можно использовать массивы:

while IFS='#' read -A arr; do
    echo "${#arr[@]} items, second item: ${arr[1]}"
done < file

read -Aработает и в Zsh, но индексы массива основаны на -. Bash read -aработает аналогично ksh.

1
28.01.2020, 02:22

Теги

Похожие вопросы