Если вы просто хотите поместить маркер комментария после (возможно, пустого) пробела в начале каждой строки, вы можете просто использовать группу захвата, чтобы получить его согласно следующей расшифровке:
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]/#&/'
, который вставит #
перед первым символом без пробела без табуляциина каждой строке.