Как выбрать URL изображения с помощью Regex для Grep в скрипте bash? - PullRequest
1 голос
/ 02 октября 2019

У меня есть текстовый файл, где мне нужно выбрать URL для изображений, используя скрипт bash. Пример строки из текстового файла:

<icon height="36" width="36" density="ldpi" src="res/icon/android/ldpi.png"/>

Я написал следующий скрипт с использованием Regex:

echo $line | grep -E -o "[^\"\'=\s]+\.(jpe?g|png|gif)"

Вывод показывает: /icon/android/ldpi.png Однако мне нужно: res/icon/android/ldpi.png

Может кто-нибудь помочь решить проблему и сделать правильный вывод, как res/icon/android/ldpi.png? Заранее спасибо! ?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Если вы можете использовать awk, вы можете сделать:

awk -F'src=' 'NF>1 {split($2,a,"\"");print a[2]}' file
res/icon/android/ldpi.png

Он напечатает все данные в диапазоне "", если он придет после src=

Если это необходимотолько расширение jpg / gif / png?

awk -F'src=' 'NF>1 && $2~/\.(jpe?g|png|gif)/ {split($2,a,"\"");print a[2]}' file
res/icon/android/ldpi.png
0 голосов
/ 02 октября 2019

Здесь \s не распознается grep как шаблон сопоставления пробелов, он соответствует \ и s, а поскольку res содержит s, он не сопоставляется.

Вы можете попробовать

grep -Eo "[^\"'=[:space:]]+\.(jpe?g|png|gif)" <<< "$line"

или использовать сопоставление регулярных выражений Bash:

rx="src=([\"'])([^\"']+\.(jpe?g|png|gif))\1"
if [[ "$line" =~ $rx ]]; then
  echo "${BASH_REMATCH[2]}";
fi;

См. онлайн-демонстрацию

Совпадение с шаблоном src=([\"'])([^\"']+\.(jpe?g|png|gif))\1

  • src= - буквальная подстрока
  • ([\"']) - группа 1: a " или '
  • ([^\"']+\.(jpe?g|png|gif)) - группа 2 (это значение доступно через "${BASH_REMATCH[2]}" после обнаружения совпадения): любые 1+ символов, кроме " и ', за которыми следуют . и jpeg, jpg, png, gif
  • \1 - значение группы 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...