Захват значений между двойными скобками

Удалите кавычки в конце вашего .bashrc.

Он должен выглядеть следующим образом:

# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
     . /etc/bashrc
fi
# User specific aliases and functions
umask u=rwx,g=rwx,o=
1
01.08.2018, 09:15
3 ответа
$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1
2
27.01.2020, 23:14

Вы можете распечатать значения (с начальным пробелом )с:

$ 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
1
27.01.2020, 23:14

С 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
    
4
27.01.2020, 23:14

Теги

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