Advanced find/replace commands in Linux

Advanced find/replace commands in Linux

Below are some random find/replace examples that I've used in the past with a brief explanation of each.

Example 1 - Recursively find a string

Recursively search through all files in $ORACLE_HOME/bpel and list out the filenames that have the hostname string "dev78.net" in them.

find $ORACLE_HOME/bpel -type f | xargs grep "dev78.net"

Example 2 - Recursively replace a string

Recursively search from the current directory, and replace all references of "orabpel" with "orabpel2" in all files.

find . -type f -exec sed -i "s%orabpel%orabpel2%" {} \;

Example 3 - Recursively replace a string in a specific location within the line

In the command below, everything between the first % and the second % represents the original search string. Everything between the second % and the third % is the new string to be replaced.

find . -type f -exec sed -i "s%\(\)\(.*\)?wsdl\(.*\)%\1\2\.wsdl\?wsdl\3%" {} \;

The original search string consists of 4 parts:

(1) <soapEndpointURI>
(2) *
(the string "?wsdl" in between 2 and 3)
(3) *

The new string search string keeps parts 1, 2, and 3 intact, but replaces the text in between with ".wsdl?wsdl".

So if the original string looked like this:

<soapEndpointURI>http://thisisahmed/hello?wsdl</soapEndpointURI>

It would now look like this:

<soapEndpointURI>http://thisisahmed/hello.wsdl?wsdl</soapEndpointURI>

Example 4 - Exclude files
Same as Example 3, but will not search/replace inside of .class, .jar, or .zip files.

find . -type f \( -iname "*.class" ! -iname "*.jar" ! -iname "*.zip" \) -exec sed -i "s%\(\)\(.*\)?wsdl\(.*\)%\1\2\.wsdl\?wsdl\3%" {} \;

Example 5 - Recursively replace the hostname in URLs
For every string that takes the form "http://*:7777" (the * is just a wildcard, but can be any value), replace it with "http://${HOSTNAME}:7777" where ${HOSTNAME} is an environment variable.

find -type f -exec sed -i "s%\(ocation=\"http://\)\(.*\):7777\(.*\)%\1${HOSTNAME}:7777\3%" {} \;