Это позволит получить вам имя файла:
grep -oP "\b[^/]*\.txt"
И это поможет вам simple
:
grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'
И это поможет вам обоим:
grep -oP '\b[^/]*\.txt|(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'
Пример:
s='abc/xyz-ibl.txt-234- "simple", /* col */'
echo "$s" |grep -oP "\b[^/]*\.txt"
echo "$s" |grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'
Выход:
xyz-ibl.txt
simple
Примечание: -P
для Perl регулярного выражения.
EDIT:
По вашему комментарию, если вы хотите, чтобы извлечь их, если только оба они соответствуют, то лучше использовать sed
чем grep
.
Использование sed
с расширенными регулярными выражениями:
echo "$s" |sed -nr 's#.*/(\b[^/]+\.txt).*"([^"]*)*"\s*,\s*/\*\s*col\s*\*/#\1\n\2#p'
Использованием Основных регулярных выражений:
echo "$s" |sed -n 's#.*/\([^/]*\.txt\).*"\([^"]*\)*"[[:space:]]*,[[:space:]]*/\*[[:space:]]*col[[:space:]]*\*/#\1\n\2#p'
Невозможно объединить эти 2 регулярных выражения в одном? – Shahzad
@Shahzad да, добавлено еще одно grep с двумя слитыми. – Jahid
Работает, но все равно работает как OR. Можно ли заставить его работать как AND, где оба выражения должны совпадать в одно и то же время. – Shahzad