In a text file I need to comment out all lines by adding a ; as the first character of each line. What is a good way to do this? I thought of Vim's visual block mode, but I couldn't find a "select all" option and marking several hundred lines manually also isn't great.

Any idea? I have nano, vi and vim at hand, I would prefer one of those for this task.

5 Answers 5


In Vim you can also just do the global replace on the start of all lines:

  • explanation: : to enter Ex command mode, % to specify all lines in the file, s/^/;/ to insert a ; at the beginning of every line. The % is a range, it means all lines. type :help ranges in vim to get more information about ranges in 4. Ex command-line ranges
    – cas
    Sep 8, 2012 at 1:45

In Vim: gg0<ctrl-v>GI;<Esc>

  • Thank you, that works great, but I don't understand (and according to my testing also don't need) the "gg" at the beginning? Sep 7, 2012 at 15:40
  • gg goes to the first line.
    – jw013
    Sep 7, 2012 at 15:45
  • Why is the 0 necessary? gg also goes to the beginning of the line (unless there's a configuration option I'm not aware of?)
    – Izkata
    Sep 7, 2012 at 20:31
  • 1
    gg goes to the first non-blank character. This is not what you want if the first character on the first line was a space or tab.
    – jw013
    Sep 7, 2012 at 20:49
  • 3
    @gorkypl: While in insert mode, you'll just see your edit in the first line. Once you hit <kbd>Esc</kbd>, it will apply the edit to the whole block. Sep 9, 2012 at 18:55

For a simple task like this you could use sed or perl. For a small footprint, use sed for this simple task:

sed -i.old -e 's/^/;/' file

This preserves a copy of the original file as "*.old" and adds a ";" at the beginning of every line.

In the event that your sed isn't a GNU version (as is the case on many Unix variants), it is likely that you won't have the inplace (-i) option. Either simply redirect to a new output file or use Perl as perl -pi.old -e 's/^/;/' file

  • thanks, a nice way for a script, for now I prefer the vim solution as I need to edit the file anyway and need an editor for that :-) Sep 7, 2012 at 15:52

I would add to jw013's answer by changing the replace to


That can be rerun as many times as you like and will not add semicolons endlessly to the beginning of lines already having it in the beginning.

It can also be used with sed or perl with the colon and percentage sign removed.

It replaces in all lines (%) every line that starts with something other than a semicolon to start with a semicolon and then the character that it started with originally (to keep it in the file).

Both commands (mine and jw013's) should be done in command mode, which is the default start mode of vi/vim and can be accessed with the key when in Insert or replace modes.

  • Good to understand your options, and choose what's appropriate but I'd often prefer to not avoid the double commenting because then I can see what was previously already commented, and I can reverse the operation.
    – mc0e
    Oct 17, 2014 at 5:40
  • On the other hand, undoing the edit later will become unnecessarily difficult as you no longer can just remove the first character on each line to return the text to it's original form.
    – Kusalananda
    Sep 30, 2023 at 11:06

You can do it by using vi editor only -

  • The g flag to the substitution becomes meaningless as soon as you use anchors in the regular expression.
    – Kusalananda
    Sep 30, 2023 at 11:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .