давайте предположим, что в VIM у меня есть следующие строки:

все, что (сильные) люди должны делать, это подталкивать (тяжелые) веса

снова (и снова) снова, чтобы набрать мышцы

и мне нужно преобразовать слова в круглых скобках в верхний регистр, какой самый удобный способ сделать это? Как мне сказать vim, что для первого нужно выбрать все (!) закрывающая скобка? До сих пор я придумал

:%s/\s(.*)\s/\U&/g

к сожалению, это будет прописывать все между «сильным» и «тяжелым», что не то, что я хочу. Есть ли шанс сказать vim, что он должен выбирать символы только для следующей закрывающей скобки? (извините за глупый пример, я не мог придумать что-то более изощренное ... или, по крайней мере, связанное с vim ... да)

3 ответа3

2

Эта замена делает то, что вы хотите:

:%s/(.\{-})/\U&/g

Как сказал Саванто, * жаден: он соответствует 0 или более, насколько это возможно, предшествующего атома. Здесь я просто использую противоположность *: {-} чтобы соответствовать 0 или более, как можно меньше, предыдущего атома.

1

Попробуйте эту команду в vim:

:%s/\s([^)]*)\s/\U&/g

Использование .* Является «жадным»: оно будет соответствовать всем символам, включая первый ) в первой строке, и продолжаться до последней ) , таким образом, все, что между

Использование [^)]* заставляет механизм регулярных выражений искать любые символы, которые не входят в a ) в () , и использовать их с заглавной буквы. По сути, это заставляет матч быть «ленивым», а не «жадным».

См. Разделы "Лень против жадности" и "Альтернатива лени" в руководстве по Regex.

0

Помните, что если вам нужно только в верхнем регистре первая скобка:

Поместите курсор в круглые скобки - где угодно - и нажмите gUi(

gU " change to uppercase and wait for a motion
i( " it s for "inside parenthesis"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .