langs
— это не массив, а строка в вашем коде.
Чтобы сделать его массивом и использовать:
langs=( EN GE )
dir_EN=/xx
dir_GE=/zz
dir_ml=()
for i in "${langs[@]}"; do
declare -n p="dir_$i"
dir_ml+=( "$p" )
done
printf 'dir_ml = "%s"\n' "${dir_ml[@]}"
В приведенном выше цикле $i
по очереди принимает значения EN
и GE
. Это также вводит ссылку на имя переменную p
. При доступе к значению p
строка, которая была присвоена переменной при ее объявлении, будет интерпретироваться как имя переменной, и будет возвращено значение этой переменной.
Результатом вышеизложенного будет
dir_ml = "/xx"
dir_ml = "/zz"
Чтобы использовать ссылки на имена в bash
, вам потребуется bash
версии 4.3 или выше.
Другая (интересная, но худшая )возможность:
dir_EN=/xx
dir_GE=/zz
# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml
for i in "${!dir_@}"; do
dir_ml+=( "${!i}" )
done
printf 'dir_ml = "%s"\n' "${dir_ml[@]}"
Здесь $i
будет принимать значения имен переменныхdir_EN
и dir_GE
по очереди. Затем мы используем косвенную переменную с ${!i}
, чтобы получить значение этой переменной. Этот вариант не нуждается в массиве langs
, но вместо этого предполагает, что никакая другая переменная не имеет имениdir_
-что-то (, что может считаться немного хрупким, поскольку пользователь может легко вводить переменные с такими именами в окружение скрипта ).
Вывод для этого кода такой же, как и для кода выше.
Вы можете извлечь диапазон строк, используя awk
. Следующая команда извлечет 2 -6 строк (включительно )из FILENAME и запишет их в ВЫВОД.
cat FILENAME | awk 'NR >= 2 && NR <= 6' > OUTPUT
Вы также можете сделать извлечение из известной позиции до конца файла, как это
cat FILENAME | awk 'NR >= 2' > OUTPUT
NR
означает «Числовая запись»
Вы также можете динамически получить номер строки с помощью grep и передать его команде awk
для извлечения этих строк
LINE_START=`grep -nr "STRING" FILENAME | grep -o '^[0-9]\+'`
cat FILENAME | awk 'NR >= $LINE_START' > OUTPUT
На самом деле я могу легко открыть его с помощью Notepad++, а затем просто Ctrl+F для поиска.
grep -A200 searchword file.xml
можно использовать для вывода 200 строк после каждого совпадения. searchword
— это слово, которое вы ищете, а file.xml
— это имя файла XML.
Вы также можете использовать -B200
для вывода 200 строк перед каждым соответствием и -C200
для вывода 200 строк до и 200 строк после.
Обратите внимание, что правильный синтаксический анализатор XML почти всегда лучше, чем использование grep или регулярного выражения: