Home Bash scriptingHow To Replace Text In Multiple Files Using A Bash Script In Linux

How To Replace Text In Multiple Files Using A Bash Script In Linux

By sk
1.4K views 3 mins read

If you have many files with outdated information, updating them manually is time-consuming. Whether it's fixing outdated file paths, renaming variables, or modifying config values, Bash provides powerful tools like grep, sed, and find to automate this task. In this guide, we will learn how to replace text across multiple files efficiently using a Bash script.

Why and When Use Bash for Bulk Text Replacement?

Automating text replacement is useful for:

  • Updating variable names in code files.
  • Changing file paths in scripts.
  • Fixing incorrect configuration settings.
  • Renaming project names in documentation.

Instead of editing each file manually, a Bash script can do it in seconds.

Allow me to explain it with an example Bash script.

Problem: Bulk Replace Paths in Multiple Files

Imagine you have multiple files referring to old log file paths:

  • Old Path: ~/data/logs/app.log
  • New Path: ~/data/log/app.log

Instead of searching and replacing each instance manually, let’s automate it.

Step 1: Create a Test Directory and Sample Files

First, create a test environment before modifying real files.

Create a directory in your home folder:

mkdir -p ~/replace_test && cd ~/replace_test

Create sample files containing the old path:

echo 'Log file: ~/data/logs/app.log' > script1.sh
echo 'ERROR_LOG="~/data/logs/app.log"' > config.env
echo 'echo "Processing ~/data/logs/app.log"' > process.sh

Verify occurrences of the old path:

grep "~/data/logs/app.log" *

Sample Output:

config.env:ERROR_LOG="~/data/logs/app.log"
process.sh:echo "Processing ~/data/logs/app.log"
script1.sh:Log file: ~/data/logs/app.log

Step 2: Replace Text in Multiple Files Using a Bash Script

Now, create a script named replace_text.sh:

#!/usr/bin/env bash

if [[ $# -ne 3 ]]; then
echo "Usage: $0 <old_path> <new_path> <directory>"
exit 1
fi

OLD_PATH=$(printf '%s\n' "$1" | sed 's/[\/&]/\\&/g')
NEW_PATH=$(printf '%s\n' "$2" | sed 's/[\/&]/\\&/g')
SEARCH_DIR=$3

echo "Replacing occurrences of: $1 -> $2 in $SEARCH_DIR"

# Find and replace text safely
find "$SEARCH_DIR" -type f -exec sed -i "s/$OLD_PATH/$NEW_PATH/g" {} +

echo "Replacement completed."

Step 3: Make the Script Executable

chmod +x replace_text.sh

Step 4: Run the Script

Execute the script to replace all occurrences of ~/data/logs/app.log with ~/data/log/app.log:

./replace_text.sh "~/data/logs/app.log" "~/data/log/app.log" ~/replace_test

Sample Output:

Replacing occurrences of: ~/data/logs/app.log -> ~/data/log/app.log in /home/ostechnix/replace_test
Replacement completed.

Step 5: Verify the Changes

Run:

grep "~/data/log/app.log" *

Sample Output:

config.env:ERROR_LOG="~/data/log/app.log"
process.sh:echo "Processing ~/data/log/app.log"
script1.sh:Log file: ~/data/log/app.log

Ensure no old path remains:

grep "~/data/logs/app.log" *

If there's no output, the replacement worked.

This script,

  • Handles Special Characters: Escapes /, &, and other symbols correctly.
  • Uses find -exec sed: Safer than grep | xargs sed.
  • Efficient for Large Projects: Works on many files without excessive CPU usage.

You can now use this script on real files.

Precautions Before Running it on Real Files:

  • Backup Your Files: Always create a backup before making bulk changes
  • Test on a Small Sample: Run it on a test directory first, as we did with ~/replace_test.
  • Dry Run with grep: Check how many files will be affected. You can run grep -rl "~/data/logs/app.log" ~/replace_test/ to do it.
  • Manually Inspect Changes: After running the script, verify a few modified files.

Conclusion

In this tutorial, we learned how to replace text in multiple files using a simple Bash script. We have explained how this script automates path updates in multiple files, preventing errors and saving time with a practical example. Always test with backups before running on critical files.

Related Read:

You May Also Like

1 comment

EarBiteR March 16, 2025 - 7:57 pm

Nice article although you could do the same with:

grep -RiIl 'search' | xargs sed -i 's/search/replace/g'

This command searches recursively (-R), ignores case (-i), lists file names (-l), and uses xargs to pass the file names to sed for in-place (-i) replacement of search with replace.

Reply

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This website uses cookies to improve your experience. By using this site, we will assume that you're OK with it. Accept Read More