Удалите кавычки в конце вашего .bashrc
.
Он должен выглядеть следующим образом:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
umask u=rwx,g=rwx,o=
$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department
$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1
Вы можете распечатать значения (с начальным пробелом )с:
$ echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF'
1 department
Это позволит прочитать значения:
read val1 val2 <<<$(echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF')
Это будет работать для одной скобки и любых дополнительных полей.:
$ echo "{{1,department,name,list}}" | awk -F '[ {},]' 'NF=NF'
1 department name list
Аналогичное решение возможно с grep:
$ echo '{1,department}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
$ echo '{{1,department}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
$ echo '{{1,department,name,list}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
name
list
Из переменной в оболочке должно совпадать точное количество полей:
$ value='{{1,department}}'
$ re='\{\{([^},]*),([^}]*)\}\}'
$ [[ $value =~ $re ]] && echo "${BASH_REMATCH[@]:1}"
1 department
С GNU grep
и любой оболочкой POSIX:
out=$(grep -Po '\{\{\K.*?(?=\}\})' < your-file)
val1=${out%%,*}
val2=${out#*,}
-P
:указывает grep
использовать perl-совместимые регулярные выражения для своих \K
и (?=)
операторов \K
:устанавливает начало возвращаемого значения . a\Kb
совпадает с ab
, но возвращает b
. Итак, здесь мы сопоставляем {{...
, но возвращаем только ...
, чтобы исключить {{
из вывода. (?=...)
делает то же самое для }}
. Это оператор просмотра -вперед, который соответствует 0 ширине, если ...
соответствует там без включения ...
в возвращаемое значение $out
заканчивается 1,department
. Мы используем стандартные операторы оболочки ${var%%pattern}
и ${var#pattern}
для извлечения части до и после первой запятой. Это предполагает, что файл содержит только одно вхождение {{...}}
и что он содержит по крайней мере одну запятую.
POSIX, вы можете заменить эту команду grep
на:
sed -n 's/.*{{\([^}]*\)}}.*/\1/p'
Теперь, если у вас есть
some text {{1,department}} other text
в переменной оболочки, вы также можете извлечь его с помощью:
zsh
if [[ $string =~ '\{\{([^},]*),([^}]*)\}\}' ]]; then
val1=$match[1] val2=$match[2]
fi
bash
if [[ $string =~ \{\{([^},]*),([^}]*)\}\} ]]; then
val1=${BASH_REMATCH[1]} val2=${BASH_REMATCH[2]}
fi