С регулярными выражениями Perl:
$ echo 'this is a long string that needs to be shortened' \
| perl -pe 's/^(.{15}).+/$1.../'
this is a long ...
Самый простой способ думать о регулярных выражениях - это рассматривать его как образец, которому нужно соответствовать. В этом случае паттерн начинается с начала строки:
^
(Обратите внимание, что /
- произвольный разделитель. Вместо этого могут использоваться другие символы.) ^
- это символ, представляющий начало строки в регулярном выражении. Далее регулярное выражение соответствует любому символу:
^.
A .
- это символ регулярного выражения для любого символа. Но мы хотим сопоставить первые 15 символов:
^.{15}
Существует несколько различных модификаторов, которые представляют повторение. Наиболее распространенным является *
, что означает 0 или более. A +
обозначает 1 или более. {15}
очевидно представляет ровно 15. (Обозначения {...}
являются более общими. Таким образом, *
можно записать {0,}
, а +
- это то же самое, что {1,}
.) Теперь нам нужно захватить первые 15 символов чтобы мы могли использовать их позже:
^(.{15})
Все, что находится между (
и )
, фиксируется и помещается в специальную переменную, называемую $1
(или иногда \1
). Второй захваченный кусок будет помещен в $2
и так далее. Наконец, вам нужно сопоставить конец строки, чтобы вы могли выбросить эту часть:
^(.{15}).+
Я изначально использовал *
, но, как заметил другой человек, это, вероятно, не то, что нужно, когда длина строки ровно 15 символов:
$ echo 'this is a long ' \
| perl -pe 's/^(.{15}).*/$1.../'
this is a long ...
Использование +
означает, что шаблон не будет совпадать, если не будет заменен символ 16 th .
Вторая половина утверждения - это то, что печатается:
$1...
Используется переменная $1
, которую мы поймали ранее, и точки являются буквальными .
s на этой стороне подстановки. Обычно все, кроме переменных регулярных выражений, является литералом справа от оператора подстановки.