Я пытаюсь использовать grep и sed для форматирования текста, и мне нужна помощь с моим оператором grep для включения дефисов и предшествующего текста в вывод.
Примеры строк:
Merry.Ex-Mas.2014.1080p.Text.x265-JOHN
30.Rock.A.One-Time.Special.2020.1080p.Text.x265-JOHN
Creature.from.the.Black.Lagoon.REMASTERED.1954.1080p.BluRay.x265-JOHN
1984.1984.1080p.Text.x265-JOHN
желаемый результат будет:
Merry Ex-Mas 2014
30 Rock A One-Time Special 2020
Creature from the Black Lagoon 1954
1984 1984
Благодаря @ grzegorz-pudłowski У меня есть эта строка кода. (но по какой-то причине дефисы и все перед ним удаляются)
`grep -E -o '(\\w*[\\.]?)*(19|20)[0-9]{2}'`
(в AppleScript требуются дополнительные экраны)
Эти команды grep приводят к:
Mas.2014
Time.Special.2020
Creature.from.the.Black.Lagoon.1954
1984.1984
Затем я перехожу к sed, чтобы заменить точки пробелами:
| sed 's/\\. */ /g'"
Исходный ответ от @ grzegorz-pudłowski, который был удален из stackoverflow:
В этой ситуации лучше, чем sed, должно быть grep. Я предполагаю, что у вас есть куча файлов, и вы хотите их переименовать или что-то еще. Поэтому я бы использовал что-то вроде этого:
echo "Title.Text.2012.1080p.text.text" | grep -E -o "(\w*[\.]?)*(19|20)[0-9]{2}"
Итак ... -E
- это флаг «расширенного регулярного выражения». Вместо этого вы можете использовать egrep
. Следующий флаг - -o
, и он заставляет grep печатать только совпадающее выражение (так как вы хотите выбросить остальную часть этой строки).
Regexp прост:
(\w*[\.]?)*
match ноль или более групп из нуля или более буквенно-цифровых символов с нулем или одной точкой в конце. (19|20)
соответствует 19 или 20, если вы хотите соответствовать году (при условии, что 1900-2099 годы, поэтому измените эту часть, если вам нужен более широкий диапазон) [0-9]{2}
совпадение двух цифр от 0 до 9
После этого вы можете передать результат в mv
или что-то еще. Однако если вы grep
файл, просто используйте:
grep -E -o "(\w*[\.]?)*(19|20)[0-9]{2}" filename.txt