Linux sed命令

sed

sed(stream editor)是linux下的一个强大的文本处理工具。 它根据用户指定的地址(ADDRESS)匹配到相应的行,并且逐行对文本进行用户指定的动作(删除,更新,插入,打印)。

sed [OPTION] 'ADDRESS&&ACTION' FILE_NAME

OPTION:

# OPTION
-i 直接更新文件,而不是只把修改后的内容输出到终端
-n 只打印被sed处理过的行
-f 读取文件内到sed动作并执行
-r 支持扩展到正则表达式

ADDRESS格式:

# ADDRESS
n                   //第n行
n1,n2               //n1到n2行
first~step          //从first开始,每隔step行的那些行
$                   //最后一行
/regexp/            //正则表达式
addr1,+N            //从addr1开始之后的N行
addr1,~N            //从addr1开始,直到下面第一个行号是N的倍数的那一行
/regexp/,/regexp/   //两个正则之间的行

动作:

# ACTION
p    --> 打印本行
i    --> 在本行上面新加一行
a    --> 在本行下面新加一行
c    --> 修改本行的内容
d    --> 删除本行
=    --> 打印行号

举例:

bogon:tmp liliang$ cat test.txt
line1
line2
line3
line4
line5
hello world.
keep fight.
bye!

# 打印第2行
bogon:tmp liliang$ sed -n '2p' test.txt
line2

# 打印2-4行
bogon:tmp liliang$ sed -n '2,4p' test.txt
line2
line3
line4

# 打印两个正则之间的行
bogon:tmp liliang$ sed -n '/hello/,/bye/p' test.txt
hello world.
keep fight.
bye!

# 删除第2行到最后一行
bogon:tmp liliang$ sed '2,$d' test.txt
line1

# 在第一行的上面新增一行
bogon:tmp liliang$ sed '1i line0' test.txt

# 在第一行的下面新增一行
bogon:tmp liliang$ sed '1a line0' test.txt

# 替换第一行的内容
bogon:tmp liliang$ sed '1c new line1' test.txt

# 删除最后一行
bogon:tmp liliang$ sed '$d' test.txt

# 删除空行
bogon:tmp liliang$ sed '/^$/d' test.txt 

# 从文件执行命令
cat <<EOF > sed_actions
1p
2p
EOF
sed -n -f sed_actions test.txt

替换:

# -i in place,表示直接修改文件而不是只把修改后的内容打印到输出

# 替换每行中模式首次匹配的内容
sed 's/pattern/replace_string/' file

# 使用g标记执行全局替换
sed 's/pattern/replace_string/g' file

# sed命令会将s之后的字符视为命令分隔符。这允许我们更改默认分隔符
sed 's:text:replace:g'
sed 's|text|replace|g'

# 移除空行
sed '/^$/d' file

# 已匹配字符串 &
echo this is an example | sed 's/\w\+/[&]/g'
[this] [is] [an] [example]

# 字串匹配标记 \1 \2 ...
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
> this is 7 in a number
echo "seven EIGHT" | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
> EIGHT seven

Keep Fight!