Извлеките число со специальными символами из файла, используя команды sed и grep - PullRequest
2 голосов
/ 23 апреля 2019

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

Файл содержит

xxxx [098] yyyy zzzz

Мне нужно найти гггг, и, если в строке есть совпадения, я должен извлечь сам 098.

Я пытаюсь с

sed 's/.*\[\([^]]*\)\].*/\1/g' str.txt

для извлечения числа без сопоставления с образцом.

и я использую

sed -nr 's/.*( |^)([0-9]+) yyyy.*/\2/p' str.txt 

для сопоставления с образцом и получения числа, которое помещается перед этим совпадением. Но я не мог объединить эти две команды. Я путаю с ошибкой

sed: -e выражение # 1, символ 26: неизвестная опция для `s '

Я думаю, что это произошло из-за использования / в качестве разделителя больше.

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Вам всегда нужно использовать условную логику печати для тех случаев, когда вы решаете напечатать для условия. С помощью предикатов -n и p вы можете управлять командой печати совпадающей группы, только если совпадение было успешным.

Итак, объединяя ваши попытки, вам нужно что-то вроде

sed -n 's/.*\[\([^]]*\)\][[:space:]]yyyy.*/\1/p' 

, который не будет печататься ни для какого другого случая, кроме yyyy после строки [..].

Но анализ файла с ограниченным пространством довольно прост, если вы решите использовать awk, в котором ваш результат может быть просто записан как

awk '$3 == "yyyy" { gsub(/[][]/,"",$2); print $2 }'
0 голосов
/ 23 апреля 2019

если данные в 'd' пробовали на GNU SED

sed -E 's/.*xxxx\s*\[(098)\]\s*yyyy.*/\1/' d
0 голосов
/ 23 апреля 2019

Поскольку вы пометили grep, другой вариант, если вы можете использовать gnu grep, - это использовать опцию -P Perl-compatible regular expression и использовать обходные пути:

grep -Po "(?<=\[)\d+(?=\] yyyy)" str.txt

Это даст вам 098

...