--- title: Sed date: 2020-12-27 18:34:08 background: bg-red-400 tags: - editor - replace - text - utility categories: - Linux Command intro: | [Sed](https://www.gnu.org/software/sed/manual/sed.html) is a stream editor, this sed cheat sheet contains sed commands and some common sed tricks. plugins: - copyCode --- ## Getting Started ### Sed Usage Syntax ```shell script $ sed [options] command [input-file] ``` With pipeline ```shell script $ cat report.txt | sed 's/Nick/John/g' ``` ```shell script $ echo '123abc' | sed 's/[0-9]+//g' ``` ### Option Examples {.col-span-2} | Option | Example | Description | | ------ | ------------------------------------------ | --------------------------------------- | | `-i` | sed -ibak 's/On/Off/' php.ini | Backup and modify input file directly | | `-E` | sed -E 's/[0-9]+//g' input-file | Use extended regular expressions | | `-n` | sed -n '3 p' config.conf | Suppress default pattern space printing | | `-f` | sed -f script.sed config.conf | Execute sed script file | | `-e` | sed -e 'command1' -e 'command2' input-file | Execute multiple sed commands | {.show-header} ### Multiple commands ```shell script {.wrap} $ echo "hello world" | sed -e 's/h/H/g' -e 's/w/W/g' Hello World ``` Use `-e` to execute multiple sed commands ### Sed script ```shell script $ echo 's/h/H/g' >> hello.sed $ echo 's/w/W/g' >> hello.sed $ echo "hello world" | sed -f hello.sed Hello World ``` Use `-f` to execute sed script file ### Examples ```shell script $ sed 's/old/new/g' file.txt $ sed 's/old/new/g' file.txt > new.txt $ sed 's/old/new/g' -i file.txt $ sed 's/old/new/g' -i.backup file.txt ``` See: [Sed examples](#sed-examples) ## Sed commands ### Commands {.col-span-2} | Command | Example | Description | | ------- | -------------------------------------- | --------------------------- | | `p` | sed -n '1,4 p' input.txt | Print lines 1-4 | | `p` | sed -n -e '1,4 p' -e '6,7 p' input.txt | Print lines 1-4 and 6-7 | | `d` | sed '1,4 d' input.txt | Print lines except 1-4 | | `w` | sed -n '1,4 w output.txt' input.txt | Write pattern space to file | | `a` | sed '2 a new-line' input.txt | Append line after | | `i` | sed '2 i new-line' input.txt | Insert line before | {.show-header} ### Space commands | Command | Description | | ------- | ------------------------------------------------------------ | | `n` | Print pattern space, empty pattern space, and read next line | | `x` | Swap pattern space with hold space | | `h` | Copy pattern space to hold space | | `H` | Append pattern space to hold space | | `g` | Copy hold space to pattern space | | `G` | Append hold space to pattern space | See also: [File spacing](#file-spacing) ### Flags ```shell script $ sed 's/old/new/[flags]' [input-file] ``` --- | Flag | Description | | -------- | ------------------------------------------ | | `g` | Global substitution | | `1,2...` | Substitute the nth occurrence | | `p` | Print only the substituted line | | `w` | Write only the substituted line to a file | | `I` | Ignore case while searching | | `e` | Substitute and execute in the command line | ### Loops commands | Command | Description | | --------- | ------------------------------------------------------------------ | | `b label` | Branch to a label (for looping) | | `t label` | Branch to a label only on successful substitution
(for looping) | | `:label` | Label for the b and t commands (for looping) | | `N` | Append next line to pattern space | | `P` | Print 1st line in multi-line | | `D` | Delete 1st line in multi-line | ### Misc Flags | Flag | Description | | ------------------------- | ---------------------------------------------------------------------------- | | / \| ^ @ ! # | Substitution delimiter can be any character | | `&` | Gets the matched pattern | | `( ) \1 \2 \3` | Group using `(` and `)`.
Use `\1`, `\2` in replacement to refer the group | ## Sed examples ### Replacing text {.row-span-2} Replace all occurrences of a string ```shell script $ sed 's/old/new/g' file.txt ``` Replace only the nth occurrence of a string ```shell script $ sed 's/old/new/2' file.txt ``` Replace a string only on the 5th line ```shell script $ sed '5 s/old/new/' file.txt ``` Replace "world" with "universe" but only if the line begins with "hello" ```shell script $ sed '/hello/s/world/universe/' file.txt ``` Remove "\" from the end of each line ```shell script $ sed 's/\\$//' file.txt ``` Remove all whitespace from beginning of each line ```shell script $ sed 's/^\s*//' file.txt ``` Remove comments. Even those that are at the end of a line ```shell script $ sed 's/#.*$//' file.txt ``` ### Search for text Search for a string and only print the lines that were matched ```shell script $ sed -n '/hello/p' file.txt ``` Case insensitive search ```shell script $ sed -n '/hello/Ip' file.txt ``` Search for a string but only output lines that do not match ```shell script $ sed -n '/hello/!p' file.txt ``` ### Appending lines Append line after line 2 ```shell script $ sed '2a Text after line 2' file.txt ``` Append line at the end of the file ```shell script $ sed '$a THE END!' file.txt ``` Append line after every 3rd line starting from line 3 ```shell script $ sed '3~3a Some text' file.txt ``` ### Numbering {.col-span-2} Number line of a file (simple left alignment) ```shell script $ sed = file.txt | sed 'N;s/\n/\t/' ``` Number line of a file (number on left, right-aligned) ```shell script $ sed = file.txt | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' ``` Number line of file, but only print numbers if line is not blank ```shell script $ sed '/./=' file.txt | sed '/./N; s/\n/ /' ``` Count lines (emulates "wc -l") ```shell script $ sed -n '$=' ``` ### Prepending lines Insert text before line 5 ```shell script $ sed '5i line number five' file.txt ``` Insert "Example: " before each line that contains "hello" ```shell script $ sed '/hello/i Example: ' file.txt ``` ### Deleting lines Delete line 5-7 in file ```shell script $ sed '5,7d' file.txt ``` Delete every 2nd line starting with line 3 ```shell script $ sed '3~2d' file.txt ``` Delete the last line in file ```shell script $ sed '$d' file.txt ``` Delete lines starting with "Hello" ```shell script $ sed '/^Hello/d' file.txt ``` Delete all empty lines ```shell script $ sed '/^$/d' file.txt ``` Delete lines starting with "#" ```shell script $ sed '/^#/d' file.txt ``` ### File spacing Double space ```shell script $ sed G ``` Delete all blank lines and double space ```shell script $ sed '/^$/d;G' ``` Triple space a file ```shell script $ sed 'G;G' ``` Undo double-spacing ```shell script $ sed 'n;d' ``` Insert a blank line above line which matches "regex" ```shell script $ sed '/regex/{x;p;x;}' ``` Insert a blank line below line which matches "regex" ```shell script $ sed '/regex/G' ``` Insert a blank line around line which matches "regex" ```shell script $ sed '/regex/{x;p;x;G;}' ``` ## Also see {.cols-1} - [sed cheatsheet](https://gist.github.com/ssstonebraker/6140154) _(gist.github.com)_