useful simple vi commands for DBAs

These 32 are the only commands I ever seem to use in vi:

Command Effect
:.= find out the current line number
:1 go to line 1
Ctrl-d page down
Ctrl-u page up
Shift-G go to end of file
i insert text at current position
Shift-A append text after end of current line
Shift-I insert text before start of current line
Esc get out of edit mode, back into normal vi command mode
dd delete current line
10dd delete 10 lines from current line on down
d Shift-G delete all lines from current line and below
d 1 shift-G delete all lines from current line and above
. repeat previous command
Shift-Y yank (copy) current line
p paste that copy into line below
/data search forward for occurencies of string "data"
/ search forward for next occurrence of remembered search string
? search backward for next occurrence of remembered search string
:set ic make searches case insensitive
:%s/data/index/g replace all occurrencies of "data" with "index"
:%s/"//g remove all " characters
:%s/$/ ;/ append ";" to the end of every line
:%s/^/rem / insert "rem " to the start of every line
:w write (save) file
:q quit out of vi
:q! quit out of vi without saving changes
:wq write (save) file and quit out of vi
shift-Z shift-Z same as above ":wq" except does not write (change file modification times) if you have not made any changes.
:n next file (when vi'ing a series of files, e.g. with using "vi *" at the command prompt)
u undo last command
Shift-J Join next line onto end of current line

January 12, 2007

  • :1,$s/data/index/g replace all occurrencies of “data” with “index”

    You only need use that “1,$” format if you want to specify which lines you want the search/replace to occur on. To replace all simply use:
    :s/original/replacement/

    The “g” on the end is not required any more either, but can still be used for legacy purposes.

    “:e!” reopens the existing file for editing – the bang forces it to without saving. Can be very useful!

    I also like “cw” and associated commands (eg. dw) which acts on a “word” from the cursor to the next punctuation mark. (cw stands for “change word” – deletes the word and changes the mode to insert)

    In general a number before any of the commands works, so eg “10yy” will yank 10 lines and “yG” or “dG” will yank/delete to the end of file.

    “r” changes current character to , “5r” changes next 5 chars to

  • Sorry, lost a lot of that in the html. Here’s the full text:
    :1,$s/data/index/g replace all occurrences of “data” with “index”

    You only need use that “1,$” format if you want to specify which lines you want the search/replace to occur on. To replace all simply use:
    :s/original/replacement/

    The “g” on the end is not required any more either, but can still be used for legacy purposes.

    “:e!” reopens the existing file for editing – the bang forces it to without saving. Can be very useful!

    I also like “cw” and associated commands (eg. dw) which acts on a “word” from the cursor to the next punctuation mark. (cw stands for “change word” – deletes the word and changes the mode to insert)

    In general a number before any of the commands works, so eg “10yy” will yank 10 lines and “yG” or “dG” will yank/delete to the end of file.

    “r[char]” changes current character to [char], “5r[char]” changes next 5 chars to [char]

  • A couple of other useful-sh things:

    % (i.e. shift-5) – takes you to the matching bracket, if you’re on a bracket

    qx,q,@x – to start recording, stop recording and execute a macro (called x). Probably vim only

  • shift z is not equivalent to :wq in that it does not save (write) the file if there are no unsaved changes.

  • Andrew

    Many thanks for this page. It’s the only place on the web where I could find the commands I needed quickly.

    Star!

  • Hey,

    How does one insert a new line?

    For instance, if my file is –
    test 1
    test 2
    test 3

    and I want to make it,
    test 1

    test 2

    test 3

    Will a simple ‘:s/test/\n test’ work?

  • Hi kedarm.
    :%s/$/ctrl+v ctrl+m
    Does that. That’s how you type it, but it appears as
    :%s/$/^M
    On the vi screen.
    Works because $ is the end of line character in vi. ^ is the equivalent beginning of line character, I sometimes use that instead.
    Andrew.

  • I’ve got some doubts –

    1) Difference between :%s and :$s
    :%s/$/ctrl+v ctrl+m – After every instance of $ (end line), insert ctrl+v ctrl+m (new line)?
    :$s/$/ctrl+v ctrl+m – Replace every instance of $ (end line) with ctrl+v ctrl+m (new line)
    Is the above correct?

    2) Why use ctrl+v ctrl+m
    Why doesn’t :%s/$/$/g work? This should mean that append after every $ (new line) another $ (new line)?
    Why should ctrl+v ctrl+m and not another $ – eg, after every instance of an end-line, put another end-line, something analogous to
    if (s[i]==’\n’) s[i+1]=’\n’;

    3) Why not use /g?
    Why don’t we use the /g after :%s/$/ctrl+v ctrl+m? Doesn’t it tell the command to do it for every occurrence of $ (end-line)?

    4) Escape sequences
    If I want to replace the character $ (dollar) by c (cents), is there some escape sequence I can use so that vim doesn’t mistakenly hunt for end-of-line characters instead of the ‘$’ character?

    Thanks
    Kedar

  • Hi Kedar,

    1) :%s changes every line, :$s only changes the last line in the file.
    2) $ is end of line rather than new line. ctrl+v ctrl+m is carriage return/line break character.
    3) You can include /g if you want, makes no difference to this particular command, since there will be only one end of line marker in each line.
    4) Use the “\” character to escape out special vi characters. So this command would change all $ symbols to c:
    :%s/\$/c/g

    Andrew.

  • Leave a Reply

    Your email address will not be published. Required fields are marked *