Text Case Transformations with Sed: Master Advanced Techniques
Master sed command for text case transformations - convert text to uppercase, lowercase, and more with practical examples.
Need to convert text to uppercase or lowercase quickly? Sed handles this in one line. Useful for cleaning data, formatting logs, or standardizing config files.
What Is Sed?
sed (Stream Editor) is a command-line tool for text manipulation. It processes input line by line, which makes it fast for large files.
Sed is great for case conversion because:
- Works non-interactively (no prompts)
- Handles large files efficiently
- Can target specific patterns
- Works with pipes and other commands
Other sed guides:
When You Need Case Conversion
Common situations:
- Data cleanup - Standardize names or fields
- Log formatting - Make error levels consistent (ERROR vs error)
- Config files - Match required case for certain apps
- Batch processing - Convert file extensions or headers
Manual editing is tedious. Sed automates it.
Basic Case Transformation Commands
sed offers several methods for changing text case. Here are the most effective approaches:
Method 1: Using the Translate Command (y)
Convert to lowercase:
echo "HELLO WORLD" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
# Output: hello world
Convert to uppercase:
echo "hello world" | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
# Output: HELLO WORLD
Method 2: Using Substitution with Case Modifiers
Convert to lowercase (GNU sed):
echo "HELLO WORLD" | sed 's/.*/\L&/'
# Output: hello world
Convert to uppercase (GNU sed):
echo "hello world" | sed 's/.*/\U&/'
# Output: HELLO WORLD
Method 3: Pattern-Specific Case Changes
Change specific words:
sed 's/linux/LINUX/g' filename.txt
Change words matching a pattern:
sed 's/\b[a-z]\+/\U&/g' filename.txt # Capitalize all words
Quick Reference
| Command | Function |
|---|---|
y/A-Z/a-z/ | Convert uppercase to lowercase |
y/a-z/A-Z/ | Convert lowercase to uppercase |
s/.*/\L&/ | Convert entire line to lowercase (GNU sed) |
s/.*/\U&/ | Convert entire line to uppercase (GNU sed) |
Note: The \L and \U modifiers work with GNU sed. For broader compatibility, use the y command.
Converting Case in Files
Working with files requires different approaches depending on whether you want to modify the original file or create a new one.
Convert Entire File to Lowercase
Using translate command (portable):
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' filename.txt > output.txt
Using case modifiers (GNU sed):
sed 's/.*/\L&/' filename.txt > output.txt
Convert Entire File to Uppercase
Using translate command:
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' filename.txt > output.txt
Using case modifiers:
sed 's/.*/\U&/' filename.txt > output.txt
In-Place File Editing
Modify original file directly:
sed -i 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' filename.txt
Create backup before modifying:
sed -i.bak 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' filename.txt
Target Specific Patterns
Convert only lines matching a pattern:
sed '/^ERROR/s/.*/\U&/' logfile.txt
Convert specific words:
sed 's/\blinux\b/\U&/g' filename.txt
Practical Examples
Capitalize first letter of each line:
sed 's/^./\U&/' filename.txt
Convert file extensions to lowercase:
sed 's/\.[A-Z]*$/\L&/' filelist.txt
Safety Tips:
- Always test commands without
-ifirst - Use
-i.bakto create backups - Test on sample files before processing important data
Batch Processing Multiple Files
Processing multiple files efficiently requires combining sed with shell utilities and loops.
Using For Loops
Convert all .txt files to lowercase:
for file in *.txt; do
sed -i 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' "$file"
done
Convert with backup:
for file in *.txt; do
sed -i.bak 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' "$file"
done
Using Find and Xargs
Process files recursively:
find . -name "*.txt" -type f | xargs sed -i 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
Process with null delimiters (handles spaces in filenames):
find . -name "*.txt" -type f -print0 | xargs -0 sed -i 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
Using Find with -exec
More reliable for complex filenames:
find . -name "*.txt" -type f -exec sed -i 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' {} \;
Process multiple files at once (faster):
find . -name "*.txt" -type f -exec sed -i 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' {} +
Conditional Processing
Convert case only in files containing specific keywords:
grep -l "ERROR" *.log | xargs sed -i 's/error/ERROR/g'
Convert only specific lines:
find . -name "*.conf" -exec sed -i '/^#/!s/.*/\L&/' {} \;
Practical Examples
Convert all PHP files to lowercase:
find ./src -name "*.php" -exec sed -i 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' {} +
Convert log levels to uppercase:
find ./logs -name "*.log" -exec sed -i 's/\b\(info\|warn\|error\|debug\)\b/\U&/g' {} +
Safety Best Practices
-
Always backup first:
find . -name "*.txt" -exec cp {} {}.backup \; -
Test on sample files:
find . -name "sample*.txt" -exec sed 'y/A-Z/a-z/' {} \; -
Use version control or create archives before batch operations
-
Check results with diff:
diff original.txt modified.txt
Summary
Sed handles case conversion with two main approaches:
ycommand - portable, works everywhere\Land\U- GNU sed only, shorter syntax
Key tips:
- Test without
-ifirst - Use
-i.bakwhen editing in place find+xargsfor batch processing
For complex field processing use awk. For simple character translation use tr. For Unicode use perl.
Quick Reference Guide
Common Case Conversion Commands
# Convert to lowercase (portable)
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt
# Convert to uppercase (portable)
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt
# Convert to lowercase (GNU sed)
sed 's/.*/\L&/' file.txt
# Convert to uppercase (GNU sed)
sed 's/.*/\U&/' file.txt
# In-place editing with backup
sed -i.bak 'y/A-Z/a-z/' file.txt
# Process multiple files
find . -name "*.txt" -exec sed -i 'y/A-Z/a-z/' {} +
Quick FAQ
y or \L/ \U?
Use y for portability. Use \L/\U on GNU sed if you prefer shorter syntax.
How to target specific patterns?
sed '/pattern/s/.*/\U&/' file.txt - converts lines containing “pattern” to uppercase.
Can I undo sed changes?
No. Use -i.bak to create backups, or work on copies.
Files with spaces in names?
find . -name "*.txt" -print0 | xargs -0 sed -i 'command'
Unicode characters?
Sed’s y only handles ASCII. Use tr, awk, or perl for Unicode.