Сохранить совпадения grep в виде массива

Вам могут понадобиться коды терминалов, см. http://wiki.bash-hackers.org/scripting/terminalcodes и https://en.wikipedia.org/wiki/ANSI_escape_code для подробностей (или http://invisible-island.net/xterm/ctlseqs/ctlseqs.html для довольно технического описания. кодов, относящихся к xterm).

Вот пример того, как задать заголовок:

set_title() {
  printf '\033]0;%s\007' "$*"
}

3
06.03.2019, 01:51
1 ответ

С ksh93илиmksh:

{ read -rd=; IFS=: read -rA filetypes; } <file

Команда в {...;}выше сначала будет считывать до первого символа =во входных данных включительно. Эта часть ввода будет храниться в переменной REPLYи в дальнейшем ни для чего не использоваться. Затем код переходит оттуда и считывает строки с разделителями:-в массив filetypes.

Параметр -dдля readв kshзаставляет команду читаться до заданного символа (, а не до символа новой строки ). Опция -Aкоманды позволяет считывать ее в индексированный массив, а не в строковую переменную. При использовании -Aзначение переменной IFSиспользуется для разделения элементов массива на входе.

Тестирование:

$ cat file
FILETYPE=A:B:C:D
$ { read -rd=; IFS=: read -rA filetypes; } <file
$ printf '"%s"\n' "${filetypes[@]}"
"A"
"B"
"C"
"D"

Изменение -Aна -aзаставит код работать в bash.


Если файл содержит другие строки, которые вы, возможно, не хотите читать, то с помощью ksh93используйте

grep '^FILETYPE=' file | { read -rd=; IFS=: read -rA filetypes; }

Обратите внимание, что это не работает ни в mksh, ни в bash, если не установлена ​​опция оболочки lastpipeи код выполняется в не -интерактивной оболочке (, т. е. в сценарии )с заданием -управление отключено (и -Aизменено на -a, как указано выше ).

0
27.01.2020, 21:13

Теги

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