Итак, вы хотите захватить первую букву, последнюю букву и число, игнорируя при этом середину.
В регулярном выражении мы используем (
и )
, чтобы сообщитьдвигатель, который мы хотим захватить, все остальное просто подбирается, или «съедается», но не захватывается. Таким образом, шаблон должен выглядеть следующим образом:
([a-z])[a-z]*([a-z]) ([0-9]+)
([a-z])
для захвата первой буквы [a-z]*
для соответствия нулю или более символов, но не захватывать . Здесь мы выбираем «*», потому что в середине может не быть совпадений, например, когда есть две или менее букв. ([a-z])
для захвата последней буквы.
«съесть» пробел. ([0-9]+)
, чтобы захватить номер. Мы используем +
вместо *
, поскольку нам требуется число в этой позиции.
sed
использует другой синтаксис для некоторых этих конструкций, поэтому мы будемиспользуйте флаг -E
. Вы можете обойтись без него, но вам придется избегать ()+
символов, которые IMO делает шаблон немного запутанным.
Теперь, чтобы извлечь захваченный контент, мы должны использовать специфическую для движка последовательностьперсонажи. sed
использует \n
, где n - номер группы захвата, поэтому наш окончательный шаблон должен выглядеть следующим образом:
\1\3\2
\1
: первая буква \3
: номер \2
: последняя буква
Теперь мы собрали все вместе:
$ echo librarian 16|sed -r 's/([a-z])[a-z]*([a-z]) ([0-9]+)/\1\3\2/g'
l16n