Replace a single string in a large number of files in Unix
In Unix, there are two ways to replace a single string in a large number of files, depending on whether or not you have Perl installed on your system.
If you have Perl installed on your system
With Perl, you can make the replacement from the Unix command line prompt. At the prompt, enter:
perl -pi -e 's/old_string/new_string/g' file_pattern
Replace old_string
with the string you want to replace and new_string
with the replacement string. Replace file_pattern
with the files you want to modify. This can be a shell wildcard, such as *.html
. The search is case sensitive and Perl will replace substrings of words. For example, take the following command:
perl -pi -e 's/temp/tmp/g' *.html
Perl would change every instance of temp
it found into tmp
(including instances of temporary
; it would change them to tmporary
because of the temp
string in the beginning of the word), but would not change the word TEMP
into tmp
. If the string has characters Perl or the shell would normally interpret as commands, such as /
(a forward slash), <
(a less-than symbol), >
(a greater-than symbol), or ;
(a semicolon), put \
(a backslash) before the character. Take the following replacement string, for example:
/happy/
To correctly replace it, you would have to escape the forward slashes with the escape character (the backslash) so that the forward slashes aren't interpreted as commands. Your replacement string would need to be:
\/happy\/
If you don't have Perl installed on your system
If you don't have Perl installed on your system, you can also create a shell script using the sed
command. Use an editor such as Emacs, Pico, or vi to write the shell script. The sed
command outputs the changes to temporary files, then the script replaces the files containing the old string with the temporary files, which have the new string. A sample script follows:
#!/bin/sh myname="/tmp/`whoami``date +%d%m%H%M%S`" if test -f $myname then echo "$0: Cannot make directory $myname (already exists)" 1&>2 exit 0 fi mkdir "$myname" for FILE in $@; do sed 's/old_string/new_string/g' $FILE > "$myname"/"$FILE"new_tmp mv "$myname"/"$FILE"new_tmp $FILE done rmdir $myname
Replace old_string
with the string you want to replace and new_string
with the replacement string.
/tmp
directory.
The sed
command uses the same syntax as Perl to search for and replace strings. Once you have created the script, enter the following at the Unix command line prompt:
sh script_name file_pattern
Replace script_name
with the filename of the script, and file_pattern
with the file or files you want to modify. You can specify the files that you want to modify by using a shell wildcard, such as *.html
.
Here are examples where the script is named replaceit
. In the first case, there is a single file called afile
to modify; in the second, the files to be modified are all those with .c
as a suffix.
sh replaceit afile sh replaceit *.c
At Indiana University, for personal or departmental Linux or Unix systems support, see Get help for Linux or Unix at IU.
Related documents
This is document afrk in the Knowledge Base.
Last modified on 2023-07-11 12:15:55.