Introduction
The sed
(stream editor) command is one of the most powerful text processing utilities in Linux and Unix systems. It allows you to search, find, replace, insert, and delete text in files without opening them in an editor. This comprehensive guide will show you how to master the sed
command for find and replace operations, making your text processing tasks efficient and automated.
Whether you’re a system administrator managing configuration files or a developer processing large datasets, understanding sed
is essential for effective command-line text manipulation.
Understanding sed Syntax
The basic syntax for sed find and replace operations follows this pattern:
sed 's/search_pattern/replacement/flags' filename
Where:
- s: The substitute command
- search_pattern: The text or pattern you want to find
- replacement: The text you want to replace it with
- flags: Optional modifiers that control the replacement behavior
Basic Find and Replace Examples
Simple Text Replacement
Let’s start with the example from the original question. To replace “few” with “asd” in a file called “hello.txt”:
sed -i -e 's/few/asd/g' hello.txt
This command will:
- Search for every occurrence of “few” in the file
- Replace it with “asd”
- Apply changes globally throughout the file
- Modify the original file in place
Understanding the Flags
The command above uses several important flags:
- -i: Edit files in place (directly modify the original file)
- -e: Specify the expression/command to execute
- g: Global flag – replace all occurrences on each line
Important Flag Combinations
The -i and -e Flags
Critical Note: Always use -i -e
(separated) instead of -ie
. On some systems, particularly macOS, using -ie
creates backup files with ‘e’ appended to the filename.
# Correct usage
sed -i -e 's/old/new/g' file.txt
# Avoid this on macOS - creates file.txt-e backup
sed -ie 's/old/new/g' file.txt
Global vs First Occurrence
The difference between using /g
and not using it:
# Replace only the first occurrence on each line
sed 's/few/asd/' hello.txt
# Replace all occurrences on each line
sed 's/few/asd/g' hello.txt
Example with multiple occurrences:
# Original text: "The few men, the few women, the brave."
# Without /g: "The asd men, the few women, the brave."
# With /g: "The asd men, the asd women, the brave."
Advanced sed Operations
Preview Changes Before Applying
Before modifying files in place, you can preview the changes:
# Preview changes without modifying the file
sed 's/few/asd/g' hello.txt
# Save preview to a new file
sed 's/few/asd/g' hello.txt > hello_modified.txt
Case-Insensitive Replacement
# Case-insensitive replacement (GNU sed)
sed 's/few/asd/gi' hello.txt
# Using different approach for portability
sed 's/[Ff][Ee][Ww]/asd/g' hello.txt
Using Different Delimiters
When your search pattern contains forward slashes, use different delimiters:
# Replace file paths using | as delimiter
sed 's|/old/path|/new/path|g' config.txt
# Using # as delimiter
sed 's#http://old.domain.com#https://new.domain.com#g' urls.txt
Working with Special Characters
Escaping Special Characters
Some characters have special meanings in sed and need to be escaped:
# Escape dots, asterisks, brackets, etc.
sed 's/www\.example\.com/www.newsite.com/g' file.txt
sed 's/\[old\]/[new]/g' file.txt
sed 's/\*/star/g' file.txt
Using Variables in sed
#!/bin/bash
old_text="few"
new_text="asd"
# Use double quotes to allow variable expansion
sed -i -e "s/$old_text/$new_text/g" hello.txt
Multiple Operations
Multiple Replacements in One Command
# Multiple -e expressions
sed -i -e 's/few/asd/g' -e 's/brave/courageous/g' hello.txt
# Using semicolon separator
sed -i -e 's/few/asd/g; s/brave/courageous/g' hello.txt
Processing Multiple Files
# Apply to multiple files
sed -i -e 's/few/asd/g' file1.txt file2.txt file3.txt
# Using wildcards
sed -i -e 's/few/asd/g' *.txt
# Recursive processing with find
find . -name "*.txt" -exec sed -i -e 's/few/asd/g' {} \;
Line-Specific Operations
Replace on Specific Line Numbers
# Replace only on line 5
sed -i -e '5s/few/asd/g' hello.txt
# Replace on lines 10-20
sed -i -e '10,20s/few/asd/g' hello.txt
# Replace on last line
sed -i -e '$s/few/asd/g' hello.txt
Conditional Replacements
# Replace only on lines containing specific pattern
sed -i -e '/pattern/s/few/asd/g' hello.txt
# Replace only on lines NOT containing pattern
sed -i -e '/pattern/!s/few/asd/g' hello.txt
Creating Backups
Automatic Backup Creation
# Create backup with .bak extension (GNU sed)
sed -i.bak -e 's/few/asd/g' hello.txt
# macOS/BSD sed backup syntax
sed -i '' -e 's/few/asd/g' hello.txt # No backup
sed -i '.backup' -e 's/few/asd/g' hello.txt # With backup
Common Use Cases and Examples
Configuration File Updates
# Update configuration values
sed -i -e 's/DEBUG=false/DEBUG=true/g' config.ini
sed -i -e 's/port=8080/port=3000/g' server.conf
Log File Processing
# Replace IP addresses in logs
sed -i -e 's/192\.168\.1\./10.0.0./g' access.log
# Remove sensitive data
sed -i -e 's/password=[^&]*/password=REDACTED/g' debug.log
Code Refactoring
# Update function names in source code
sed -i -e 's/oldFunctionName/newFunctionName/g' *.js
# Update import statements
sed -i -e 's/import { oldModule }/import { newModule }/g' *.ts
Troubleshooting Common Issues
Permission Errors
If you encounter permission errors:
# Check file permissions
ls -la hello.txt
# Use sudo if necessary
sudo sed -i -e 's/few/asd/g' /etc/config.conf
macOS Compatibility Issues
macOS uses BSD sed, which has different syntax:
# Portable script for both GNU and BSD sed
if sed --version >/dev/null 2>&1; then
# GNU sed
sed -i -e 's/few/asd/g' hello.txt
else
# BSD sed (macOS)
sed -i '' -e 's/few/asd/g' hello.txt
fi
Large File Performance
For very large files, consider these optimizations:
# Process in chunks
split -l 10000 largefile.txt chunk_
for chunk in chunk_*; do
sed -i -e 's/few/asd/g' "$chunk"
done
cat chunk_* > processed_largefile.txt
rm chunk_*
Best Practices and Tips
- Always test first: Run sed without
-i
to preview changes - Create backups: Use backup extensions for important files
- Use specific patterns: Avoid overly broad replacements that might affect unintended text
- Quote your patterns: Use single quotes to prevent shell interpretation
- Consider alternatives: For complex operations, consider
awk
orperl
Conclusion
The sed
command is an essential tool for efficient text processing in Linux and Unix environments. From simple find-and-replace operations to complex text transformations, mastering sed can significantly improve your productivity when working with files from the command line.
Remember to always test your sed commands on sample data before applying them to important files, and consider creating backups when modifying critical configuration files. With practice, sed will become an invaluable part of your command-line toolkit for text processing automation.
For more advanced text processing needs, explore sed’s capabilities with regular expressions, multi-line patterns, and integration with shell scripts to create powerful text processing pipelines.