Как вставить символ перед шаблоном соответствия, используя vim или sed? - PullRequest
0 голосов
/ 24 октября 2018
int main () {
  int a = 1;
}

изменить на

#int main() {
  #int a = 1;
#}

Как вставить '#' перед каждой строкой?

Ответы [ 5 ]

0 голосов
/ 20 марта 2019

In vim: сначала убедитесь, что вы не в режиме вставки, нажав клавишу escape.Затем нажмите клавишу с двоеточием и введите:

1,3s / ^ [\ t] * / & # /

Это говорит от 1 до 3 строк, после начала строки и некоторыхвозможные пробелы и / или символы табуляции, повторите эти возможные пробелы и / или символы табуляции и добавьте символ хеша.

0 голосов
/ 24 октября 2018

Возможный подход vim с использованием редактирования блока

ggctrl-vGI#esc

Начните с gg, затем ctrl + v , затем GI.Теперь нажмите символ, который хотите вставить, # и завершите его с помощью esc

0 голосов
/ 24 октября 2018

Если вы просто хотите поместить маркер комментария после (возможно, пустого) пробела в начале каждой строки, вы можете просто использовать группу захвата, чтобы получить его согласно следующей расшифровке:

printf "int main () {\n    int a = 1;\n}\n" | sed 's/^\(\s*\)/\1#/'
#int main () {
    #int a = 1;
#}

Более подробно:

  a  ccc   dd    <- markers, see below.
s/^\(\s*\)/\1#/
   bb   bb   e   <- markers, see below.
  • Маркер a, символ ^, является привязкой начальной строки, то есть он будет работать только в начале каждой строки.

  • Маркер b, набор \(...\), является группой захвата, означающей, что любой текст, захваченный этим шаблоном, будет сохранен для дальнейшего использования.

  • Маркер c, то есть \s*, будет соответствовать нулю или более пробела.Тот факт, что это внутри группы захвата, означает, что она будет сохранена.

  • Маркер d - это первая группа захвата \1, указанная ранее.Это просто вставит то, что было захвачено в строку замены.Числа, используемые для групп захвата, могут быть сложными, особенно если вы записываете в иерархии.Но, поскольку здесь вы только захватываете одну вещь, это довольно просто.

  • Маркер e - это просто #, который вы хотите добавить в конецзахваченного текста.

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


Когда Cyrus указывает на комментарий, вы также можете использовать:

sed 's/[^ \t]/#&/'

, который вставит # перед первым символом без пробела без табуляциина каждой строке.

0 голосов
/ 24 октября 2018

Моя попытка:

:%norm! _i#

% ......... hole file
nomrm! .... normal mode
_ ......... first non-blank of the line
i# ........ insert comment
0 голосов
/ 24 октября 2018

Это должно сделать это для вас:

:%s/\(^.*$\)/#\1/g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...