Это должно сделать это за вас:
:%s/\(^.*$\)/#\1/g
Если вы просто хотите поместить маркер комментария после (возможно, пустого) пробела в начале каждой строки, вы можете просто использовать группу захвата, чтобы получить его в соответствии со следующей расшифровкой:
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
- это просто #
, который вы хотите добавить в конец захваченного текста.
Суть в том, что он находит самый большой раздел пробелов в начале каждой строки и добавляет к нему символ #
.
Как указывает Сайрус в комментарии, вы также можете использовать:
sed 's/[^ \t]/#&/'
который вставит #
перед первым символом без пробела и без табуляции в каждой строке.
Другой вариант с sed и только пробелами: sed 's/[^ ]/#&/' file
@Cyrus, что является попроще. Я не могу запустить его с обычными пробелами, а не с пробелом - s/[^\s]/#&/
, кажется, всегда вставляет перед символом первый в строке, а не первым непробельным. Тем не менее, [^<space><tab>]
*, похоже, работает, поэтому я добавлю его.
@paxdiablo, потому что такие инструменты, как sed / grep / awk и т. д., не поддерживают последовательности обратной косой черты внутри класса символов ... вместо этого вы можете использовать именованные классы символов, например [:space:]
или используйте \S
, если он поддерживается, например версии этих инструментов GNU
@Sundeep: Спасибо за подсказку. Это работает для меня с GNU sed: sed 's/[^[:space:]]/#&/' file
Для полноты, поскольку вопрос задан и о Vim, одно решение, очень похожее на @Cyrus, - это :%s/\S/#&
. Но вы также можете сделать это с помощью команд Vim, например :%norm I#
. В качестве альтернативы, если у вас есть поддержка Perl, :%perldo s/\s*\K/#/
, который показывает еще одно решение для регулярных выражений с использованием \K
.
Моя попытка:
:%norm! _i#
% ......... hole file
nomrm! .... normal mode
_ ......... first non-blank of the line
i# ........ insert comment
Возможный подход vim с использованием редактирования блока
ggctrl-vGI#esc
Начните с gg
, затем с ctrl + v, затем с GI
. Теперь нажмите символ, который вы хотите вставить, #
и завершите его с помощью esc.
В vim: Сначала убедитесь, что вы не находитесь в режиме вставки, нажав клавишу ESC. Затем нажмите клавишу с двоеточием и введите:
1,3 с / ^ [\ t] * / & # /
Это говорит о строках с 1 по 3, после начала строки и некоторых возможных пробелы и / или табуляции, повторите эти возможные пробелы и / или табуляции и добавьте хеш условное обозначение.
Звучит как вопрос домашнего задания ... Как мне задавать домашние вопросы на Stack Overflow. Ожидается, что вы приложите усилия. sed вставить символ в первую позицию каждой строки сайта: stackoverflow.com.