Linux sed命令的基本使用

一、sed(stream editor)

非交互式编辑器,一次处理一行内容。(强大的流文本编辑器)

        处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

二、sed语法

Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

三、sed选项

  -n, --quiet, --silent
                 取消自动打印模式空间
  -e 脚本, --expression=脚本
                 添加“脚本”到程序的运行列表
  -f 脚本文件, --file=脚本文件
                 添加“脚本文件”到程序的运行列表
  --follow-symlinks
                 直接修改文件时跟随软链接
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
  -b, --binary
                 does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
                 open files in binary mode (CR+LFs are not treated specially))
  -l N, --line-length=N
                 指定“l”命令的换行期望长度
  --posix
                 关闭所有 GNU 扩展
  -r, --regexp-extended
                 在脚本中使用扩展正则表达式
  -s, --separate
                 将输入文件视为各个独立的文件而不是一个长的连续输入
  -u, --unbuffered
                 从输入文件读取最少的数据,更频繁的刷新输出
  -z, --null-data
                 separate lines by NUL characters
  --help
                 display this help and exit
  --version
                 output version information and exit

如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。

四、sed命令模式

a\ # 在当前行下面插入文本。
i\ # 在当前行上面插入文本。
c\ # 把选定的行改为新的文本。
d # 删除,删除选择的行。
D # 删除模板块的第一行。
s # 替换指定字符
h # 拷贝模板块的内容到内存中的缓冲区。
H # 追加模板块的内容到内存中的缓冲区。
g # 获得内存缓冲区的内容,并替代当前模板块中的文本。
G # 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l # 列表不能打印字符的清单。
n # 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N # 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p # 打印模板块的行。
P # (大写) 打印模板块的第一行。
q # 退出Sed。
b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file # 从file中读行。
t label # if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label # 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file # 写并追加模板块到file末尾。  
W file # 写并追加模板块的第一行到file末尾。  
! # 表示后面的命令对所有没有被选定的行发生作用。  
= # 打印当前行号码。  
# # 把注释扩展到下一个换行符以前。 

五、sed替换标记

g # 表示行内全面替换。  
p # 表示打印行。  
w # 表示把行写入一个文件。  
x # 表示互换模板块中的文本和缓冲区中的文本。  
y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 # 子串匹配标记
& # 已匹配字符串标记

六、sed元字符集

^ # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* # 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] # 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。  
[^] # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
\< # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

七、sed用法实例

1.示例文件

[root@master srv]# cat test.txt 
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA

2.替换

1)用MBA替换MA

前面两个斜杠中是要匹配的内容,可以使用正则,后面两个斜杠中间,是要替换的内容,是纯文本

[root@master srv]# sed 's/MA/MBA/' test.txt 
John Daggett, 341 King Road, Plymouth MBA
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MBA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MBA

2)使用多重指令替换

[root@master srv]# sed 's/MA/KFC/ ; s/PA/TCP/' test.txt 
John Daggett, 341 King Road, Plymouth KFC
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls TCP 
Eric Adams, 20 Post Road, Sudbury KFC
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KFC

3. -f(使用脚本文件)

[root@master srv]# cat cat namestate
s/MA/OKK/ 
[root@master srv]# sed -f namestate test.txt
John Daggett, 341 King Road, Plymouth OKK
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury OKK
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston OKK

4. -n(阻止输入行自动显示)

[root@master srv]# sed -n 's/MA/PPP/p' test.txt
John Daggett, 341 King Road, Plymouth PPP
Eric Adams, 20 Post Road, Sudbury PPP
Sal Carpenter, 73 6th Street, Boston PPP

5.保存输出文本

[root@master srv]# sed -n 's/MA/PPP/p' test.txt > case.txt

6.删除文本

1)删除文件的第n行 

[root@master srv]# sed '1d' test.txt
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA

2)删除文件的第n到m行

[root@master srv]# sed '1,5d' test.txt
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA

3)删除第n行到最后一行

[root@master srv]# sed '2,$d' test.txt
John Daggett, 341 King Road, Plymouth MA

4)匹配字符,删除字符所在行

[root@master srv]# sed '/John/d' test.txt
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA

5)匹配字符,从字符所在行删除到第n行

[root@master srv]# sed '/John/,3d' test.txt
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA

6)删除奇数行(1~2:从第1行开始,每过包括自身的2行就删除一行)

[root@master srv]# sed '1~2d' test.txt 
Alice Ford, 22 East Broadway, Richmond VA 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Hubert Sims, 328A Brook Road, Roanoke VA
Sal Carpenter, 73 6th Street, Boston MA

7)删除偶数行

[root@master srv]# sed '0~2d' test.txt 
John Daggett, 341 King Road, Plymouth MA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Eric Adams, 20 Post Road, Sudbury MA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 

7.sed可以从stdin(标准输入)中读取内容

[root@master srv]# cat test.txt | sed 's/MA/KL/'
John Daggett, 341 King Road, Plymouth KL
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury KL
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KL

8. -i(用修改后的数据替换原文件)

[root@master srv]# sed -i 's/MA/KL/' test.txt 
[root@master srv]# cat test.txt 
John Daggett, 341 King Road, Plymouth KL
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury KL
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KL
# 由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件
[root@master srv]# sed -i.bak 's/MA/KL/' test.txt 
[root@master srv]# ll test.txt.bak 
-rw-r--r-- 1 root root 345 Nov  8 20:08 test.txt.bak

9. -g(全局替换)

[root@master srv]# sed  's/MA/GT/g' test.txt 
John Daggett, 341 King Road, Plymouth KL
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury KL
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KL
# g标记可以使sed匹配第N次以后的字符被替换
[root@master srv]# echo "thisthisthisthis" | sed 's/this/THIS/2g'
thisTHISTHISTHIS

10.替换分隔符, s标识会认为后面的字符为分隔符

[root@master srv]# sed  's:MA:GT:' test.txt 
[root@master srv]# sed  's#MA#GT#' test.txt 

11.在文件中匹配到的部分前后加上一行

1)在匹配到开头为John的行的下一行插入内容

[root@master srv]# sed '/^John/a\hello world/' test.txt
John Daggett, 341 King Road, Plymouth KL
hello world/
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury KL
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KL

2)在匹配到开头为John的行的上一行插入内容

[root@master srv]# sed '/^John/i\hello world/' test.txt
hello world/
John Daggett, 341 King Road, Plymouth KL
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury KL
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston KL

12.将文本中等号两边的内容调换位置

[root@master srv]# cat test.txt
1 = 2
[root@master srv]# sed  "s/\(.*\) = \(.*\)/\2 = \1/" test.txt
2 = 1

13..将文件中的注释和空行删掉

[root@master srv]# cat test.txt
1 = 2

#这是一个文件

[root@master srv]# sed -r '/^#.*/d;/^$/d' test.txt
1 = 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值