Vi / VIM Find And Replace All Text Substitute Command

I am a new Linux user. I started to use vim or vi text editor. How do I find all occurrence of the word called ‘eth0’ and replace it with ‘br0’ on Linux operating systems?

Tutorial details
Difficulty Easy (rss)
Root privileges No
Requirements vim
Time 1m
Both vi and vim text editor provides the substitute command. It is used for find/search and replace text. This page explains how to use substitute command for finding and replacing text with vim/vi.

ADVERTISEMENTS

VIM Search and replace syntax

The syntax is as follows:
:%s/Search/Replace/CommandFlag
:%s/Search-Word/Replace-Word/g
:%s/Search-Word/Replace-Word/g
:%s/Search-Word/Replace-Word/gc
## Search and replace in the current line only ##
:s/Find-Word/Replace-Word/gc
## Change each 'Unix' to 'Linux' for all lines from line 36 to line 42 ##
:36,42s/Unix/Linux/g

VIM Find And Replace

Both vi and vim provides the :s command for search and replace. Let us see some easy to understand examples.

Examples

I am going to use the following sample text file:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

## full acess to lo and eth0 ##
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT

# log spoof
-A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

-A INPUT -i eth1 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth1 -s 172.16.0.0/12 -j DROP

To find each occurrence of ‘eth0’ in the current line only, and replace it with ‘br0’, enter (first press Esc key and type):
:s/eth0/br0/g

Next try to find and replace all occurrences of ‘eth1’ with ‘br1’ under vim, enter:
:%s/eth1/br1/g

Search and replace all occurrences of ‘eth1’ with ‘br1’, but ask for confirmation first on vim, enter:
:%s/eth1/br1/gc

To find and replace all occurrences of case insensitive ‘eth1’ with ‘br1’, enter:
:%s/eth1/br1/gi
The above example will find eth1, ETH1, eTh1, ETh1 and so on and replace with br1. To find and replace all occurrences of ‘eth1’ with ‘br1’ for lines from 3 to 7, enter:
:3,7s/eth1/br1/g

A quick demo

Animated gif 01: Vim Find and Replace Demo

Animated gif 01: Vim Find and Replace Demo

Substitute syntax

The full syntax is as follows:
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
So for each line in [range] replace a match of {pattern} with {string}. A {pattern} is one or more branches. A {string} can be a literal string. When [range] and [count] are omitted, replace in the current line only. When [count] is given, replace in [count] lines, starting with the last line in [range]. When [range] is omitted start in the current line. The [count] must be a positive number.

On each line, delete all occurrences of the whole word “Sysadmin”

Yes, we can delete words too:
:%s/\//g

How can I delete the first occurrence of the whole word “method_” and the following 3 characters?

:%s/\.\{3}//

Search and replace current line only

Find each occurrence of ‘bin’ in the current line only, and replace it with ‘sbin’ in wrapper.sh:
:%s/bin/sbin/gc

Conclusion

You learned how to find and replace text with vi or vim text editor using the %s substitute command. Type the following command inside vim to get help about substitute topic or see documents:
:help :substitute

🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source/DevOps topics:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04

ADVERTISEMENTS
7 comments… add one
  • Antonio Feb 26, 2014 @ 3:37

    Is a good aportation i´m a mexican student
    how to replace worlds after cursor

    • laike9m Mar 7, 2014 @ 8:12

      cursor? I think you only have one cursor so why not do it manually?

  • Mehrad Nov 24, 2015 @ 2:19

    what about skipping characters?
    I have ../aaa/ and I want to replace it with bbb/
    I tried the following but it didn’t work:
    :%s /..\/aaa\//bbb\//gc

  • Mehrad Nov 24, 2015 @ 2:26

    Hi

    forget about my previous command, it was a upper case mistake, but please mention using other delimiters and character skipping in your post. I found them below:
    http://vimdoc.sourceforge.net/htmldoc/change.html#:substitute

    cheers;

  • akd12345 Apr 12, 2016 @ 15:11

    A vote of thank !!! 🙏
    :%s/search/Replace/gic works for me

  • Nadav Kavalerchik Jul 7, 2016 @ 13:30

    Thanks!

  • Ankit Apr 26, 2017 @ 8:41

    If one line contain two identical words and i want to replace only one word which i want,
    Which command is use?

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.