Получить конкретные строки из одной длинной строки - PullRequest
0 голосов
/ 14 декабря 2018

У меня проблема с моей оболочкой, я пытаюсь получить определенные строки в очень длинной строке.

Формат строки:

Something(first:test, second:test2, third:test4, fourth:test4, fifth(Field(test:1, test2:test2,...)), Any1:test1, Any2:test3.

Я хочу получитьстрока после first, third и Any1.Я мог бы легко разделить с помощью , и получить их как значения массива, но я не могу предсказать, в какой позиции будет Any1, поэтому мне нужно определить значение "Any1".

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Указанная задача не накладывает условий или ограничений на решение.С другой стороны, в нем упоминается shell («у меня проблема с моей оболочкой»).Вот решение в оболочке (bash), использующее только пару стандартных утилит Linux: grep и cut.(Но учтите, что мы предполагаем наличие ключа -P в grep, что не является допустимым допущением для всех платформ, хотя в наши дни это кажется довольно распространенным явлением в Linux.)

$ cat -n solution.sh
     1  #!/bin/bash
     2
     3  grep -Po '\b(first|third|Any1):\w+' | cut -d: -f2
     4

$ cat infile.txt
Something(first:test, second:test2, third:test4, fourth:test4, fifth(Field(test:1, test2:test2,...)), Any1:test1, Any2:test3.

$ solution.sh < infile.txt
test
test4
test1
0 голосов
/ 14 декабря 2018

Multichar RS, вероятно, не будет работать во всех awks (*), но:

$ awk -v RS="[(,] *"  '            # record split at all the right places
BEGIN {
    a["first"];a["tird"];a["Any1"] # define the keywords we are interested in
}
split($0,b,":") && (b[1] in a) {   # split, match and score
    print b[2]
}' file
test
 test4
test1

*) Работал с GNU awk, mawk и Busybox awk, но не работал с bwk awk.

...