Извлечь значение из списка пар ключ-значение, используя grep - PullRequest
0 голосов
/ 28 июня 2018

У меня есть строка, содержащая список пар ключ-значение, например: «a: 1, b: 2, c: 3». Я хотел бы извлечь значение для указанного ключа, чтобы, например, Я бы получил «1» за «а». Я планировал сделать это с помощью регулярного выражения, как это:

'(?<=(^|,)$KEY:)^,*'

но похоже grep не поддерживает обходные пути. (Я даже не уверен, что это регулярное выражение работает правильно.) Есть ли другой способ?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете использовать

grep -oP "(?:^|,)$KEY:\K[^,]+"

Опция -o выводит совпадения. -P включает двигатель PCRE. Двойные кавычки необходимы для интерполяции строк, чтобы можно было интерполировать $KEY.

Шаблон соответствует:

  • (?:^|,) - начало строки или запятой
  • $KEY - переменная KEY
  • : - двоеточие
  • \K - оператор сброса совпадений, который отбрасывает весь сопоставленный текст
  • [^,]+ - 1+ символов кроме ,
0 голосов
/ 28 июня 2018

Будьте проще. Вам не нужны все эти вещи, просто посмотрите сравнение нужного поля и напечатайте другое поле с помощью awk:

$ awk -v key="a" -v RS=',' -F':' '$1==key{print $2}' <<< "a:1,b:2,c:3,"
1

Этот сценарий awk будет работать с любым awk в любой оболочке на любой машине UNIX. То, как вы передадите строку в awk, будет зависеть от оболочки, <<< является bash-ism, но вы можете использовать это вместо:

$ echo "a:1,b:2,c:3," | awk -v key="a" -v RS=',' -F':' '$1==key{print $2}'
1

или выполняйте другие действия в зависимости от того, хранится ли строка, которую вы хотите проанализировать, в переменной, файле или ....

0 голосов
/ 28 июня 2018

Вы можете использовать read с IFS с двоеточием и запятой в качестве разделителей полей, например:

IFS=':,' read -ra arr <<< "a:1,b:2,c:3"

Это даст вам этот массив:

declare -p arr
declare -a arr=([0]="a" [1]="1" [2]="b" [3]="2" [4]="c" [5]="3")

если вы хотите перечислить пары ключ-значение, используйте:

for ((i=0; i<${#arr[@]}; i+=2)); do echo "${arr[i]} => ${arr[i+1]}"; done

a => 1
b => 2
c => 3

Чтобы получить одно значение для данного ключа, вы можете использовать это sed:

k=a; sed -E "s/(^|.*,)$k:([^,]*).*/\2/" <<< "a:1,b:2,c:3"
1

k=b; sed -E "s/(^|.*,)$k:([^,]*).*/\2/" <<< "a:1,b:2,c:3"
2

k=c; sed -E "s/(^|.*,)$k:([^,]*).*/\2/" <<< "a:1,b:2,c:3"
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...