Regex: замените все символы после 15 с «...»

голоса
2

Я пытаюсь сделать некоторые простые форматирования вещи с «СЭД» в Linux, и мне нужно использовать регулярное выражение, чтобы обрезать строку после 15-го символа, и добавляет символ «...» до конца. Что-то вроде этого:

before: this is a long string that needs to be shortened
after: this is a long ...

Может кто-нибудь пожалуйста, покажите мне, как я мог бы написать это как регулярное выражение, и, если это возможно объяснить, как это работает, так что я мог бы научиться Regex немного лучше?

Задан 09/12/2008 в 22:35
источник пользователем
На других языках...                            


5 ответов

голоса
17

Следующие работы для меня:

echo "This is a test with more than 15 characters" | sed "s/\(.\{15\}\).\+$/\1…/"

То , что происходит здесь в том , что мы любой символ ( .) 15 раз ( {15}). Мы захватить текст таким образом , согласованный внутри скобок. Следующая часть ( .+$) не соответствует всем остальным, до конца строки. Заменим это, что мы уже захватили в скобках ( \1), а затем гиперболической многоточие.

Для удовлетворения sedрегулярных выражений диалекта «s (BRE) мы должны избежать некоторых персонажей.

Ответил 09/12/2008 в 22:38
источник пользователем

голоса
6

Объяснение ответа Konrand Рудольфа, так как вы просили объяснений (ах, как я писал это, Konrad тоже добавил свое собственное объяснение!)

 sed "s/\(.\{15\}\).+$/\1…/"

\( 

начать группу - задать регулярное выражение двигатель, чтобы помнить, что находится внутри скобок, и назначить первую такую ​​группу \ 1, второе \ 2 и т.д. Нам понадобится только \ 1 здесь

.

Матч ничего ...

\{15\}

... 15 раз.

\)

конец группы. Таким образом, \ 1 будет содержать первые 15 символов

 .+

сопрягать ничего снова. + Означает «один или более раз», так будет соответствовать символы, выходящие за рамки 15 символов мы совпавших выше, ...

 $

... до конца строки

Теперь для замены бит:

\1

Заменить содержимое \ 1

...

и три точки.

Готово!

Ответил 09/12/2008 в 22:46
источник пользователем

голоса
1

С Perl регулярных выражений:

$ echo 'this is a long string that needs to be shortened' \
| perl -pe 's/^(.{15}).+/$1.../'
this is a long ...

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

^

(Заметим , что /произвольный разделитель. Другие символы могут быть использованы вместо) . В ^это символ , который представляет собой начало строки в регулярном выражении. Далее регулярное выражение соответствует любому символу:

^.

.Символ регулярного выражения для любого символа. Но мы хотим , чтобы соответствовать первые 15 символов:

^.{15}

Есть несколько различных модификаторов , которые представляют собой повторение. Наиболее распространенным является *что означает 0 или более. +Обозначает 1 или более. {15}очевидно , представляет собой ровно 15. (The {...}нотации является более общим Так. *можно было бы написать {0,}и +так же , как {1,}.) Теперь нам нужно захватить первые 15 символов , так что мы можем использовать их позже:

^(.{15})

Все , что между (и )захвачен и помещен в специальной переменной $1(или иногда \1). Второй кусок захвачен будет помещен в $2и так далее. И, наконец, вы должны соответствовать до конца строки , так что вы можете бросить эту часть прочь:

^(.{15}).+

Первоначально я использовал *, но в качестве еще одного человека указал, что , вероятно, не то , что требуется , когда строка длиной ровно 15 символов:

$ echo 'this is a long ' \
| perl -pe 's/^(.{15}).*/$1.../'
this is a long ...

Используя +средства шаблон не будет соответствовать , если не 16 - й символ заменить.

Вторая половина утверждения, что печатается:

$1...

$1Переменная , которую мы поймали раньше, используется и многоточие в буквальном смысле .s на этой стороне замещения. В общем, все , кроме регулярных выражений переменных являются дословным на правой стороне заместительного заявления.

Ответил 09/12/2008 в 22:39
источник пользователем

голоса
0

Вы действительно хотите , чтобы просто колотить от всего после 15 - го символа, или вы пытаетесь ввести 15-символьный максимальную длину? Что делать , если строка длиной 16 символов? Все решения , представленные до сих пор отрубит , что только один избыточный символ , чтобы заменить его тремя точками. (Я знаю , Konrad и Павел использовал многоточие характер, но OP использовала три точки в примере,. Мы должны получить решение о том , что)

Если вы хотите обрезать строки максимальной длиной 15 , включая три точки , вы можете сделать это:

s/^\(.\{12\}\).\{3\}.\+$/\1.../

Он по-прежнему соответствует только если есть больше, чем 15 символов, но затем он отрезает все после 12-го символа, чтобы освободить место для точек.

Ответил 10/12/2008 в 05:06
источник пользователем

голоса
0

В Perlом, вы могли бы написать s/(.{15}).*/$1.../. Я не уверен , что СЭД может использовать {15} нотации , но если нет, то s/\(...............\).*/\1.../(с 15 точек в группе).

Я никогда не могу вспомнить , нужно ли бежать (при группировке в СЕПГ. Я просто попытался это и вам не нужно \(и\)

Ответил 09/12/2008 в 22:42
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more