Вместо использования отдельных переменных с именами, начинающимися с B2_
, можно использовать ассоциативный массив(B2
). например.
Обратите внимание, :следующее относится к zsh
. ksh
и bash
также имеют ассоциативные массивы, но синтаксис их инициализации и использования отличается (см. ниже ).
typeset -A B2
# initialise array
B2=(ACCOUNT_ID 12345 ACCOUNT_KEY 54321 REPOSITORY somewhere)
# two different ways of adding elements to the array
B2[FOO]=bar
B2+=(NAME fred)
for key val in ${(kv)B2}; do
echo "$key: $val"
done
Вывод для этого примера будет:
ACCOUNT_KEY: 54321
FOO: bar
REPOSITORY: somewhere
ACCOUNT_ID: 12345
NAME: fred
Вы также можете распечатать весь массив (в форме, подходящей для повторного -использования в скрипте или в командной строке )с помощьюtypeset -p
:
% typeset -p B2
typeset -A B2=( ACCOUNT_ID 12345 ACCOUNT_KEY 54321 FOO bar NAME fred REPOSITORY somewhere )
Те же операции в ksh
или Bash будут следующими:
# initialise it
typeset -A B2
B2=([ACCOUNT_ID]=12345 [ACCOUNT_KEY]=54321 [REPOSITORY]=somewhere)
# add elements
B2[FOO]=bar
B2+=([NAME]=fred)
# get a list of the keys and use them as indexes to get the values
for key in "${!B2[@]}"; do
echo "$key: ${B2[$key]}"
done
# print the entire array
typeset -p B2
Вы можете сделать это, используя awk
, работая в «режиме абзаца» (, см., например,. Решение @EdMorton здесь и решение проблемы «печатать все поля, кроме первых» из stackoverflow)
awk -v RS= -F'\n' '{$1=$2=""; print $0}' file.srt > file.txt
Это будет интерпретировать любые блоки «пустой строки» -разделенного текста как одну входную запись,чьи поля являются отдельными строками текстового блока. Приведенная выше команда затем заменит первые два поля (=lines )«пустой» строкой и напечатает всю строку.
Обратите внимание, что при этом остаются два пробела (в качестве разделителя полей вывода )перед «фактически выводом». Если это проблема, вы можете явно напечатать только оставшиеся поля с помощью внутреннего циклаawk
-:
awk -v RS= -F'\n' '{for (i=3; i<NF; i++) printf("%s ",$i); printf("%s\n",$NF)}' file.srt > file.txt
используйте это, чтобы получить шаблон
sed ':begin;$!N;s/\n/ /;tbegin' file.txt | sed 's/ /\n/g'