Skip to main content

Programmer's Guide: Find and Replace with Vim

Many of us don't like Vim because of it's unconventional and unique command set. But if you get to know certain functionalities common to other popular editors, you would not be required to lift your hands from keyboard while typing. One such functionality that we often use in editors is "Find and Replace". The same feature, with many more customizations, is also provided by Vim. This post will focus on various Find and Replace features of Vim.

Let's start with a file which contains a lot of "lorem ipsum".

Now let us replace "lorem ipsum" with "hello world".

First, we will focus on replacing "lorem" with "hello" in the first line. We need to execute following command in vim.
:s/lorem/hello/g

The :s signifies "substitute" command provided by vim.
The g flag at the end means "global". This means that all the occurrences in the selected context will be changed. In this case, all the occurrences in the first line will be changed.

In the below image, you can see "lorem" has been replace by "hello" in the first line.


Let us now replace all the "lorem" with "hello". To replace all, we use :%s instead of :s.
Command:
:%s/lorem/hello/g


If you observe closel, the "Lorem" in the second line has not been replaced. This is because, by default, the substitute function is case-sensitive. We need to use i flag to make it case-insensitive.
Command:
:%s/lorem/hello/gi


But Find and Replace (F&R) tools also ask for confirmation before actually making changes. Can we do that in vim? Yes of course! Vim can do everything that a normal F&R tool can do. Just use c flag at the end. Let us replace all the "ipsum" with "world".
Command:
:%s/ipsum/world/gc

Here,
y: yes, replace this match
n: no, skip this match
a: all, replace all
q: quit
l: last match i.e.replace this match and exit
The last two are just to scroll up or down.

So, after pressing a, we have accomplished our objective of replacing "lorem ipsum" with "hello world".

Finally, when we want to replace exactly matching words and not all the matches, for example, in the above file if we want to replace "is" with "was" but do not want to replace the substring "is" in "This", we can use the following command:
:%s/\&#60is\&#62/was/gc



There are many more uses of Vim ":substitute" command. I hope this post will encourage you to explore more about them. I would recommend using command line and Vim to work with files on remote servers.

Comments

Popular posts from this blog

Using static IPs in Linux

It is often a requirement to assign static IP addresses to some important and permanent network interfaces. This is to avoid setting up a local DHCP server or relying on IP given by your network provider which may not be stable. This post shows steps to configure static IPs in Linux using Ubuntu 16.04 and Ubuntu 18.04 distros. We are considering two distros as network configuration has changed significantly in Ubuntu 18.04. There are two general steps to be followed: 1. Configure the network interface and assign a static IP. 2. Restart interface for the changes to take effect. Ubuntu 16.04  The current interfaces on the system are as follows: As can be seen, enp0s8 interface does not have any IP. Let's assign a static IP to it. In case you already have an interface with a DHCP assigned IP, you just need to change that IP and make it static. Edit the /etc/network/interfaces file and add the following code block. Prefer using the IP address range available for pri...

Local domain name resolution using /etc/hosts

The /etc/hosts file is a powerful mechanism for managing the information about hosts in the local network in the absence of a local DNS server. Setup We have 4 VMs in the local /24 network. The following are the details: vm-1-ubuntu-16-04 - 10.0.1.11 vm-2-ubuntu-16-04 - 10.0.1.12 vm-1-ubuntu-18-04 - 10.0.1.21 vm-2-ubuntu-18-04 - 10.0.1.22 The VMs are reachable via their IP address but not by their hostnames. This is problematic because we have to remember their IP addresses everytime we want to access these hosts. It is would be much simpler to remember and access the servers by their hostnames. For that we need some sort of mapping between the IP addresses and their corresponding host names. There are 3 common ways of achieving this mapping. Setup a DNS server which handles resolution for your local network. Use an existing DNS server of the local Internet Service Provider (ISP) or any other higher level ISP. Note that a public static IP address is required for this s...

Simple HTTP Server in Python

Have you ever come across a need to share a file over a local network to a number of machines? Have you ever felt the need to share output of a task in text files available at a web-endpoint? Often, there is a requirement to quickly setup a light-weight web-server for such requirements. Python provides the easiest way to setup a simple HTTP server for such use cases with a single command. Python comes pre-installed with Linux as many of the linux libraries use python in background. Therefore there is no extra overhead of installing python. With support for python2 getting stopped in April 2020, many of the newer versions of linux distros come with default python3. Therefore this post will focus on setting up an HTTP server using both python2 and python3. We will be using Ubuntu 16.04, however it will work for majority of the linux systems where python comes pre-installed. Preparation Steps to follow before starting the server: Make sure you are in the directory which you want ...