Как правильно объединить регулярные выражения и найти в сценарии оболочки - PullRequest
0 голосов
/ 23 мая 2019

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

Я работаю с find, и яполучил это вроде работы.Если имя картинки в точности совпадает с именем в текстовом документе, или если имя картинки оканчивается любым номером, записанным в текстовом документе, оно работает.Но если номер находится в середине названия картинки, он его не находит.Поэтому я пытался добавить регулярное выражение в свою команду поиска, но мне это не удалось.


input="/Users/unix/Desktop/pictures.txt"
input_2="/Users/unix/Desktop/2019/05/23"
while IFS= read -r -u3 line
do
  find "$input_2" -iregex ".*${line}*.jpg"
done 3< "$input"

Например, если имя изображения - Right.jpg, а мой файл pictures.txt содержит Right, он найдетфайл.Если изображение называется leftRight.jpg, оно также найдет файл.Но если это что-то вроде leftRightleft.jpg, оно не найдет картинку, поэтому я немного запутался, как правильно использовать регулярные выражения здесь.

1 Ответ

0 голосов
/ 23 мая 2019

Ваше регулярное выражение просто неверно.Если вы разберетесь с ней, это будет интуитивно понятно, почему:

.*${line}*.jpg

означает:

  • .* - любой символ повторяется 0 или более раз
  • ${line}* - содержимое ${line}, последний символ повторяется 0 или более раз
  • . - любой отдельный символ
  • jpg - буквенные символы jpg

Итак, в вашем примере, если у вас есть Right в вашем файле, вы бы сопоставили реальные файлы, подобные этим, которые вы, вероятно, не хотите совпадать:

leftRigh.jpg
leftRighXjpg
leftRighttttttttt.jpg
leftRighttttttttttttttttttttttttttttttttjpg

То, что вы, вероятно, хотите, это:

.*${line}.*\.jpg
...