Использование grep для сопоставления всех комбинаций подстрок - PullRequest
0 голосов
/ 01 июля 2019

У меня есть строки из строк:

(string start..) Enzyme: "ENZA ENZB ENZD ENZE" (..string end)  
(string start..) Enzyme:"ENZA ENZC ENZD ENZF" (..string end) 
(string start..) Enzyme:"ENZO ENZC ENZD ENZE" (..string end)

где я хочу, чтобы мой grep выводил все от начала «Фермента» до конца второй двойной кавычки, независимо от значения или количества того, что находится между двумя двойными кавычками (может быть от 1 до 20 ферментов, и я не знать их ценности). Энзимы всегда в верхнем регистре альфа, но если их больше одного, между ними всегда есть пробел.

Я пробовал:

grep -o "Enzyme: \"(.*)\"
grep -o "Enzyme: \"[A-Z]\"
grep -o "Enzyme: \"[:alpha:]\"
grep -o "Enzyme: \"*\"

, но ничего из этого не возвращает ничего. Буду благодарен за любые идеи, чтобы получить то, что я хочу. Спасибо!

Ответы [ 4 ]

0 голосов
/ 01 июля 2019

Чтобы сделать это с помощью grep, вам потребуется GNU grep для -o:

grep -o 'Enzyme: *"[^"]*"'

В противном случае, используя любой sed в любой оболочке на каждом компьютере UNIX:

$ sed -n 's/.*\(Enzyme: *"[^"]*"\).*/\1/p' file
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"
0 голосов
/ 01 июля 2019
grep -o 'Enzyme: ?"[^"]+"'

Совпадение Enzyme: буквально, за которым следует необязательный пробел, буквальная двойная кавычка, все, что не двойная кавычка, и буквальная двойная кавычка.

0 голосов
/ 01 июля 2019

Grep всегда выводит все совпадение, которое включает в себя ваши энкеры ankers: "'и" ". Чтобы сопоставить ankers, но не указывать их в выходных данных, вы должны использовать позитивный взгляд с префиксом и позитивный взгляд с постфиксом.из вашего желаемого результата:

grep -oE "(?<=Enzyme:\")(.*)(?=\")"

для тестирования: echo 'Enzyme:"enz3 enz6 enz12 enz19"' | grep -oP "(?<=Enzyme:\")(.*)(?=\")"

при этом, мне кажется, гораздо проще использовать sed в этом случае: echo 'Enzyme:"enz3 enz6 enz12 enz19"' | sed -r "s/Enzyme:\"(.*)\"/\1/g"

s/find/replace/ - команда поиска и замены sed

0 голосов
/ 01 июля 2019

Это проверка Enzyme:, за которой следуют ноль или более пробелов, за которыми следует " до следующего ".

Использование -E флаг:

grep -oE 'Enzyme:[[:space:]]*"[^"]+"'
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"

С -P флагом:

grep -oP 'Enzyme:\s*"[^"]+"'
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...