How to modify files with SED?
What is sed?
sed
is a stream editor which is used to perform basic text transformations on an input stream (a file or input from a pipeline) or filter strings. It permits to modify the contents of different lines in a file, based on some parameters.
For the examples shown in this article, you used the 4.2.1 version of sed
as shown below:
sed --version</span></span>
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
sed
has a syntax as follows:
sed [-options] [command] [<file(s)>]
Visualization
For the cases where you need to display the contents of a file or part of it, we can use any of the following commands:
sed 5q file1 # see the firsts 5 lines of file1
cat -n file1 | sed -n '5,6 p' # see lines 5 and 6 of file1
sed -n '1p' file1 > file2 # copy the first line of file1 to file2
sed -n '$p' file1 # show the last line of file1
Replacing strings and characters
In these cases, it is always advisable storing in another file, the results of a substitution, leaving the original file unchanged. Some examples are:
# replace strings in all lines that satisfied the string of file1 and store the result in file2
sed 's/old_string/new_string/g' file1 > file2
# replace strings only in lines 200 y 201
sed '200,201 s/old_string/new_string/g' file1 > file2
# replace several strings by new one
sed 's/old_string_1\|old_string_2/new_string/g' file1 > file2
# replace all lowercase to uppercase
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file1 > file2
Insert strings
As in the previous case, the original file is left unchanged while the second will contain the changes.
# insert a string at the beginning of each line
sed 's/^/string_at_the_beginning/' file1 > file2
# insert a string at the end of the file
sed -e '$ string_at_the_end' file > file2
# insert a blank line before each line that matches with string
sed '/string/{x;p;x;}' file1 > file2
# insert a blank line after each line that matches with string
sed '/string/G' file1 > file2
# insert a blank line before and other after each line that matches with string
sed '/string/{x;p;x;G;}' file1 > file2
# insert a blank line every 2 lines
sed 'n;G;' file1 > file2
Delete lines and strings
If we want to delete characters or entire lines, either because they are empty or commented, we can use the following commands:
sed '2,4 d' file1 > file2 # remove lines 100 and 105 of file1
sed '5,20 !d' file1 > file2 # delete all lines except the 5 and 20
sed '$d' file1 > file2 # delete the last line of file1
sed -i '$d' file1 # delete the last line of file1 in the same file
sed '/string/ d' file1 > file2 # remove lines that satisfied a string
sed '/^$/d' file1 > file2 # remove blank lines
sed '/^$/d; / *#/d' file1 > file2 # remove blank lines and bash comments
Enjoy Reading This Article?
Here are some more articles you might like to read next: