SED
This document provides a collection of useful one-line scripts for sed
, the Unix stream editor. These commands are designed for quick manipulation and modification of text files directly from the command line.
Text Transformations
-
Inserting Blank Lines:
sed G
: Double-space a file by inserting a blank line after each line.sed '/^$/d;G'
: Double-space a file, preserving existing single blank lines.sed 'G;G'
: Triple-space a file.sed '/regex/{x;p;x;}'
: Insert a blank line before each line matchingregex
.sed '/regex/G'
: Insert a blank line after each line matchingregex
.
-
Removing Whitespace:
sed 's/^[ \t]*//'
: Remove leading whitespace (spaces and tabs).sed 's/[ \t]*$//'
: Remove trailing whitespace.sed 's/^[ \t]*//;s/[ \t]*$//'
: Remove both leading and trailing whitespace.
-
Centering/Aligning Text:
sed -e :a -e 's/^.\{1,78\}$/ &/;ta'
: Right-align text within a 79-character width.sed -e :a -e 's/^.\{1,77\}$/ & /;ta'
: Center text within a 79-character width (method 1, leading spaces significant).sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'
: Center text (method 2, leading spaces discarded).
Line Numbering and Counting
sed = filename | sed 'N;s/\n/\t/'
: Number each line, left-aligned, using tabs for spacing.sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
: Number each line, left-aligned, right-justified numbers.sed '/./=' filename | sed '/./N; s/\n/ /'
: Number only non-blank lines.sed -n '$='
: Count the number of lines in a file (similar towc -l
).
String Manipulation and Substitution
sed 's/foo/bar/'
: Replace the first instance of "foo" with "bar" on each line.sed 's/foo/bar/g'
: Replace all instances of "foo" with "bar" on each line.sed 's/\(.*\)foo/\1bar/'
: Replace only the last occurrence of "foo" with "bar" on each line.sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'
: Replace multiple words ("scarlet", "ruby", "puce") with "red".gsed 's/scarlet\|ruby\|puce/red/g'
: Same as above, using GNU sed's alternation feature.sed '$!N;s/\n/ /'
: Join consecutive lines with a space. Useful for formatting or combining data.gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
: Insert commas into numbers (e.g., 1234567 becomes 1,234,567) using GNU sed.
Line and Paragraph Manipulation
sed '1!G;h;$!d'
: Reverse the order of lines in a file (similar totac
).sed -e :a -e '/\\$/N; s/\\\n//; ta'
: Join lines ending with a backslash with the next line. Useful for handling multi-line entries.sed -n '/^$/{p;h;};/./{x;/./p;}'
: Delete the last line of each paragraph (paragraphs separated by blank lines).
Content Filtering and Extraction
sed 10q
: Print only the first 10 lines (similar tohead
).sed -n '8,12p'
: Print lines 8 through 12.sed '52!d'
: Print only line 52.sed -n '/regexp/p'
: Print only lines matching the regular expressionregexp
(similar togrep
).sed '/regexp/d'
: Delete lines matching the regular expressionregexp
.sed -n '/Iowa/,/Montana/p'
: Print the block of lines starting with a line containing "Iowa" and ending with a line containing "Montana".sed '/Iowa/,/Montana/d'
: Delete the block of lines between "Iowa" and "Montana".sed '$!N; /^\(.*\)\n\1$/!P; D'
: Remove duplicate, consecutive lines (similar touniq
).
Newline Conversion
sed 's/.$//'
: Convert DOS/Windows newlines (CRLF) to Unix newlines (LF). Assumes all lines end in CRLF.sed 's/$/\r/'
: Convert Unix newlines (LF) to DOS/Windows newlines (CRLF).
Special Applications
sed "s/.
echo \\b//g"
: Remove nroff overstrikes (often seen in older man pages).sed '/^$/q'
: Extract the header of an email message (up to the first blank line).
Sed Execution and Quoting
Sed commands can be piped or applied directly to files:
sed 'command' filename # Applies the command to the file
cat filename | sed 'command' # Equivalent command using pipes
sed 'command' filename > output # Redirects output to a new file
Use single quotes ('...'
) around sed
commands to prevent shell interpretation of special characters like $
and backticks. Double quotes are usually required in DOS versions of sed
.
Performance Optimization
For large files, using an address range or the q
command can dramatically improve speed. For example:
sed -n '51q;45,50p' filename # Prints lines 45-50 and quits, much faster for large files.
Placing the pattern before the s
command in substitutions can also improve performance:
sed '/foo/s/foo/bar/g' filename # Faster than sed 's/foo/bar/g' filename
This cheat sheet provides a starting point for using sed
. For more advanced usage and a deeper understanding of regular expressions, consult the sed
man page (man sed
) and dedicated resources on regular expressions.