sed 's/id_ad=\(.*\)&action/\1/' filename
Команда выше возвращает любые строки (.*) между двумя словами START (id_ad=) и END (&action ]) в имени файла. \(...\) Используется для захвата групп. \( - начало группы захвата и заканчивается на \). И с \1 мы печатаем его индекс группы (у нас есть одна группа захвата)
. Лучшая команда sed для вышеуказанного решения может быть такой:
sed 's/^id_ad=\([0-9]*\)&action/\1/' filename
^ Начало строки. [0-9]*: Любое число с 0 или более вхождениями. Подробнее о команде sed
grep -Po '(?<=id_ad=)[0-9]*(?=&action)' filename
От man grep:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
Возвращает любое число с 0 или более вхождений ([0-9]*) между двумя словами START (id_ad=) и END word (&action) в имени файла.
(?<=pattern): положительный Lookbehind. Пара круглых скобок с открывающей скобкой, за которой следует знак вопроса, символ «меньше» и знак равенства.
(?<=id_ad=)[0-9]* (положительный lookbehind) соответствует 0 или более числам чисел, которые следуют после id_ad= в имени файла.
(?=pattern): Положительный Lookahead: Положительная конструкция lookahead представляет собой пару круглых скобок с открывающей скобкой, за которой следует знак вопроса и знак равенства.
[0-9]*(?=&action): (положительный lookahead) соответствует 0 или более вхождений чисел, за которыми следует шаблон (&action), не делая шаблон (&action) частью совпадения. Подробнее о команде sed
Дополнительные ссылки: Подробнее см. в команде sed GREP для дизайнеров