在日常工作中,sed是一个实用的文本文件处理工具。由于它是一个非交互式方式,它处理的文本文件包括:来自键盘输入、文件重定向、字符串、变量、来自管道的文本等等。
sed主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
sed[-nefri] ‘command’输入文本
sed:全称stream editor (流编辑器)
sed输出文本文件的保存,有两种方式:
- 使用>符号,输出到一个新文件 (见例子:输出到新文件)
- 在原始文件上修改且保存 (见例子:直接修改原文件内容,替换指定行的所有内容)
sed调用的三种方式:
- 直接在shell命令行上调用(见例子:显示数据)
- 将sed命令插入脚本文件后,通过sed命令调用脚本(见例子:通过sed命令调用脚本)
- 将sed命令写入脚本文件后,将其+x变成可执行,需要在文件头部加上 #!/bin/sed (见例子:将sed命令写入脚本文件)
常用选项:
-n∶使用安静(silent)模式。通常 p 会与参数 sed -n一起运作。(见例子:显示数据)
-e∶直接在指令列模式上进行 sed的动作编辑。(见例子:多点编辑)
-f∶直接将 sed的动作写在一个档案内, -f filename则可以执行 filename内的sed动作;(见例子:通过sed命令调用脚本)
-r∶sed的动作支援的是延伸型正规表示法的语法。(见例子:sed -r 例子)
-i∶直接修改读取的档案内容,而不是由萤幕输出。(见例子:直接修改原文件内容,替换指定行的所有内容)
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) (见例子:在第一行之后,插入tea)
c ∶取代, c的后面可以接字串,这些字串可以取代 n1,n2之间的行!(见例子:替换第一行)
d ∶删除,因为是删除啊,所以 d后面通常不接任何咚咚;(见例子:删除第一行)
i ∶插入, i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);(见例子:在第一行之前,插入tea)
p ∶列印,亦即将某个选择的资料印出。通常 p会与参数 sed -n一起运作~ (见例子:显示数据)
s ∶取代,可以直接进行取代的工作哩!通常这个 s的动作可以搭配正规表示法!格式: s/old/new/g,(见例子:替换一行中的某部分)
高级command:
命令 | 功能描述 |
h | 拷贝pattern space的内容到holding buffer(特殊缓冲区)。 |
H | 追加pattern space的内容到holding buffer。 |
g | 获得holding buffer中的内容,并替代当前pattern space中的文本 |
G | 获得holding buffer中的内容,并追加到当前pattern space的后面 |
n | 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 |
p | 打印pattern space中的第一行。 //大写 |
q | 退出sed。 |
w file | 写并追加pattern space到file的末尾。 |
! | 表示后面的命令对所有没有被选定的行发生作用。 |
s/re/string | 用string替换正则表达式re。 |
= | 打印当前行号码 |
替换标记 |
|
g | 行内全面替换,如果没有g,只替换第一个匹配。 |
x | 互换pattern space和holding buffer中的文本。 |
y | 把一个字符翻译为另一个字符(但是不能用于正则表达式)。 |
举例:(假设我们有一文件名为SedTxt,SedTxt_2)
SedTxt内容如下:
Hello
Welcometo @LinuxShell World
Goodbye Linux
SedTxt_2内容如下:
TABASENAME=Apple
DATABASEURL="jdbc:oracle:thin:@172.10.10.10:1521:11g2"
##### #####显示数据###########
#显示第一行
test@sha:~/tmp> sed -n'1p' SedTxt
Hello
#显示最后一行
test@sha:~/tmp> sed -n'$p' SedTxt
Goodbye Linux
#显示第一行到第二行
test@sha:~/tmp> sed -n'1,2p' SedTxt
Hello
Welcome to @LinuxShell World
##### #####模糊查询显示数据##########
格式:sed -n '/查询的关键字/p'输入文件
#查询包括关键字Linux所在所有行
test@sha:~/tmp> sed -n'/Linux/p' SedTxt
Welcome to @LinuxShell World
GoodbyeLinux
#查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
格式:sed -n '/关键字/p'输入文件
test@sha:~/tmp> sed -n'/\@/p' SedTxt
Welcome to @LinuxShell World
##### #####新增数据##########
格式:sed '[行位置]a'输入文件
#在第一行之后,插入tea
test@sha:~/tmp> sed '1a tea' SedTxt
Hello
tea
Welcome to @LinuxShell World
GoodbyeLinux
#在第一行和第二行之后,插入tea
方法1:
test@sha:~/tmp>sed '1,2a tea' SedTxt
Hello
tea
Welcometo @Linux Shell World
insert
GoodbyeLinux
#在第一行之后,插入多行(如tea和or orange)
test@sha:~/tmp>sed '1a tea\nor orange' SedTxt
Hello
tea
or orange
Welcometo @Linux Shell World
GoodbyeLinux
#在第一行之前,插入tea
test@sha:~/tmp> sed '1i tea' SedTxt
tea
Hello
Welcome to @Linux Shell World
GoodbyeLinux
#在行头和行尾,插入head,tail
test@sha:~/tmp> sed's/^/head&/g' SedTxt
headHello
headWelcome to @LinuxShell World
headGoodbye Linux
test@sha:~/tmp> sed 's/$/&tail/g'SedTxt
Hellotail
Welcome to @LinuxShell Worldtail
Goodbye Linuxtail
#第二行的行头和行尾,插入head,tail
test@sha:~/tmp> sed '2s/^/head&/g' SedTxt
Hello
headWelcome to @LinuxShell World
Goodbye Linux
test@sha:~/tmp> sed '2s/$/&tail/g'SedTxt
Hello
Welcome to @LinuxShell Worldtail
Goodbye Linux
Note:
^ 表示行头,$表示行尾
文本替换格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式),/g表示每行出现的全部替换
#在所有的行头和行尾,插入head和tail
test@sha:~/tmp> sed '/./{s/^/HEAD&/;s/$/&TAIL/}' SedTxt
HEADHelloTAIL
HEADWelcome to @LinuxShell WorldTAIL
HEADGoodbye LinuxTAIL
##### #####替换数据###### #####
#替换第一行
test@sha:~/tmp>sed '1c Good Morning' SedTxt
GoodMorning
Welcometo @Linux Shell World
GoodbyeLinux
#替换第一行到第二行
test@sha:~/tmp>sed '1,2c Good Morning' SedTxt
GoodMorning
GoodbyeLinux
#替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
#替换Linux为Python,输出到其它文件 (只要加上 ><filename>)
test@sha:~/tmp>sed -n '/Linux/p' SedTxt |sed 's/Linux/Python/g' SedTxt> output
Hello
Welcometo @Python Shell World
GoodbyePython
#使用替换,删除所在行的Linux
test@sha:~/tmp>sed -n '/Linux/p' SedTxt |sed 's/Linux//g' SedTxt
Hello
Welcometo @ Shell World
Goodbye
#搜索Linux,找到welcome对应的行,并且把Linux替换为redshell:
执行后面花括号中的一组命令,每个命令之间用分号分隔,p打印,q退出
格式:sed /搜索关键字/p文件名| sed -n'/对应关键字/{s/要替换字符/新的字符/;p;q}'
test@sha:~/tmp> sed/Linux/p SedTxt |sed -n '/Welcome/{s/Linux/redshell/;p;q}'
Welcome to @redshellShell World
#直接修改原文件内容,替换指定行的所有内容
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式),/g表示每行出现的全部替换
替换前(SedTxt_2)
DATABASENAME=apple
jdbc:oracle:thin:@172.10.10.10:1521:11g2
test@sha:~/tmp>sed -i '1 s/[^ ]*$/DATABASENAME=orange/g' SedTxt_2
test@sha:~/tmp>sed -i '2 s/[^ ]*$/jdbc:oracle:thin:@172.20.20.20:1521:11g2/g' SedTxt_2
替换后(SedTxt_2)
DATABASENAME=orange
jdbc:oracle:thin:@172.20.20.20:1521:11g2
Note: [^ ]*$:除空格之外的所有内容
[^] -匹配未包含空格的任意字符,$ -匹配输入字符串的结束位置“\n”或“\r”,* - 匹配结束位置之前的所有字符
##### #####删除数据###### #####
#删除第一行
test@sha:~/tmp>sed '1d' SedTxt
Welcometo @Linux Shell World
GoodbyeLinux
#删除最后一行
test@sha:~/tmp>sed '$d' SedTxt
Hello
Welcometo @Linux Shell World
#搜索linux,删除所在行
test@sha-colline-node-h:~/tmp>sed '/Linux/d' SedTxt
Hello
##### ##### 多点编辑##### ######
#删除第一行,并将Linux替换为RedShell
test@sha-colline-node-h:~/tmp>sed -e '1d' -e 's/Linux/RedShell/g' SedTxt
Welcometo @RedShellShell World
GoodbyeRedShell
##### #####通过sed命令调用脚本##########
# file1.sed里的内容
test@sha:~/tmp> cat file1.sed
s/this/it/
s/test/sedtest/
#file2.sed里的内容
test@sha:~/tmp>cat file2.sed
this is atest
#通过sed命令调用脚本
test@sha:~/tmp>sed -f file1.sed file2.sed
it is ased test
##### ##### sed -r例子##### #####
如果不使用-r,需要在正则表达式中需要使用转移符\, 如果使用-r,就可以不使用转移符\
#使用转移符\
Test@sha:~/tmp>echo "aaa bbb "|sed 's/\(.\)/A/'
Aaa bbb
#不使用转移符\
test@sha:~/tmp>echo "aaa bbb "|sed 's/(.)/A/'
aaa bbb
#使用-r,代替不使用转义符
test@sha:~/tmp>echo "aaa bbb "|sed -r 's/(.)/A/'
Aaa bbb
##### #####将sed命令写入脚本文件后,将其+x变成可执行##### #####
将sed命令写入脚本文件input.sed如下:
#!/bin/bash
#!/bin/sed
echo "aaabbb" |sed -n '1p'
##### ####输出到新文件##### #####
test@sha:~/tmp>echo "aaa bbb"| sed -n '1p' >output.sed
test@sha:~/tmp>cat output.sed
aaa bbb
test@sha-colline-node-h:~/tmp>chmod+x input.sed
test@sha-colline-node-h:~/tmp>./input.sed
aaa bbb