Bash is a UNIX shell-compatible command process whose main task is to manipulate strings conducted in a shell environment. Programmers are at times called upon to work on different files. They can add, delete, and replace parts or the whole file to fit their work. This calls upon the knowledge of replacing string in bash. Data storage can be temporary or permanent, depending on the nature of the data. File string is essential when replacing file contents.
Replacing String in Bash
sed is vital and comes in handy to aid in replacing strings in a file with bash scripts. The string editor can be used in different ways to replace file contents in bash. An alternate but sound string editor is awk which can be brought into play when replacing string value from a file using bash. This article will show with the aid of examples how the file content can be replaced in bash. Note that knowledge in regex patterns can also be of great value when replacing string in bash.
Bash String Manipulation
When doing minor or simple replacements, the sed is not required. Bash can do the manipulation.
For example:
When replacing a fosslinux.gif with .mp4, sed is not required.
To execute the process using bash, use the coded text below:
#/bin/bash file_name="fosslinux.gif" new_extension="mp4" # Replace .gif with .mp4 generated_file_name=${file_name/.gif/.$new_extension} echo $generated_file_name
Replacing String using sed
sed can be referred to as a stream editor. Sed can replace a string in files. Let’s look at an example of a file called singleboardbytes.txt that has the following information:
Foss Linux is a great learning site for any Linux user. Check out articles published by Foss Linux on their site.
Now from our file, we need to replace the word “site” with “website” and rename the file to fosslinux.txt.
Understanding the sed syntax
sed -i 's/search_string/replace_string/' filename sed – is the command used in the execution of the above syntax ‘-i’ – used in the modification of contents in the original file with a replacement string aid whenever the search value exists in the file. ‘s’ – this is the substitute command ‘search_string’ – this represents the string value that is to be searched for replacement in the original file ‘replace_string’ – this represents the string value that is used to replace the searched value. The string should match the string found by the ‘search_string’ command. ‘filename’ – this is the filename whereby the replacement will be applied.
Execute the following command in your terminal:
sed 's/site/website/g' singleboardbytes.txt > fosslinux.txt
Note: you can also execute the command above by putting it on as a bash script.
Replacing using the -i command
After running the command, the next step is to replace using the -i command. -i is a representation for “in place”, meaning the file is only replaced, and there is no creation of extra files. Using our example above, run the following command:
sed -i 's/site/website/g' singleboardbytes.txt
From the figure below, you can see an exclamation mark that says, The file “/home/tuts/singleboardbytes.txt changed on disk.” this shows that the changes have been successfully made.
The figure below is the file containing the changes made in the previous step, both to the name of the file (singleboardbytes.txt to fosslinux.txt) and the word site has been changed to the website.
Using a variable as search values and replacements
With a little interpolation, variables can be used to do string replacement. The first sed argument, in this case, has to use double quotes instead of single quotes. For instance, your code will be similar to the one below:
tuts() { local search=$1 local replace=$2 # Note the double quotes sed -i "s/${search}/${replace}/g" singleboardbytes.txt }
sed has two flavors, namely: the FreeBSD and the Linux sed. The Linux distros use the Linux sed while OS X users use the FreeBSD sed. These flavors are quite different, and hence one cannot transfer commands from one sed flavor to another.
For instance, while replacing the file’s contents using the FreeBSD, a backup should be conducted using the .bak extension. Or you can initiate a backup with the use of empty pairs of quotes immediately after the -i notation as shown in the bash syntax below:
tuts() { local search=$1 local replace=$2 sed -i "" "s/${search}/${replace}/g" singleboardbytes.txt }
If a backup is not done while using the FreeBSD as illustrated in the syntax code above, you will fall into an error like the one shown below:
sed: 1: "/Users/user/path/tuts ...": extra characters at the end of h command
How to replace a file and match the digit pattern using the sed command
If you successfully run the script, a search for all numerical content present in a file will be performed. Then the content will then be replaced by adding $ before the numbers.
#!/bin/bash # Check the command line argument value exists or not if [ $1 != "" ]; then # Search all string containing digits and add $ sed -i 's/\b[0-9]\{5\}\b/$&/g' $1 fi
Replacing a string using the awk command
In this case, we shall be using the awk command instead of the sed command to replace a file’s contents. The difference among these commands is that the sed command directly updates the original file, which is not the case with the awk command.
#!/bin/bash # Check the command line argument value exists or not if [ $1 != "" ]; then # Search all string based on date awk '{sub("02/06/2020","12/06/2020")}1' $1 > temp.txt && mv temp.txt $1 fi
Conclusion
The above examples are vital for your progress in learning how to replace a string in Bash. Therefore, to be good at it, you will have to practice regularly. Searching and replacing string in a file might seem complex, but you will find it much more manageable when following our guidelines correctly.
A point to note is that running the commands might at times seem more manageable, but you should be careful not to wreak havoc from sed. When you input the wrong commands, you will break your computer, causing you more trouble like data loss. Hence, to be safe, always copy and paste the code as it is to your terminal. This will prevent spelling errors that might break your machine. We hope this article helped you learn how to replace a string in bash using this article.
2 comments
echo generated_file_name
=> echo $generated_file_name
Great article, it was very helpful in understanding the discrepancies in a bash script we were using on different operating systems.