Linux文件处理--sed 编辑器常用介绍及案例
Posted 沉入深海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件处理--sed 编辑器常用介绍及案例相关的知识,希望对你有一定的参考价值。
sed 编辑器
一、sed 编辑器
1.sed编辑器:
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令行文本文件中。
2.流程
sed工作流程主要包括读取、执行和显示三个过程
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并储存在临时的缓冲区(称为模式空间)
- 执行:默认情况下,所有sed命令都在模式空间中顺序的执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行。直至所有内容被处理完。
注意:默认情况下所以偶sed’命令都是再模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出的。
3.具体使用
3.1命令格式:
sed -e '格式' 文件1 文件2 ...
sed -n -e ‘操作’ 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e ' n #这里的n指行号,里跟着操作命令
操作1
操作2
...
' 文件1 文件2 #这里的文件不能是目录
3.1 常用选项(-e 、f、h、-n、-i):
-e或 --expression=: 表示用指定命令来处理输入的文本文件,
只有一个操作命令时可省略,一般在执行多个操作命令使用。
f或 --file=: 表示用指定的脚本文件来处理输入的文本文件。
h或 --help: 显示帮助。
-n --quiet或silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i: 直接修改目标文本文件。 #使用时一定慎用!!!直接对文本进行修改,最好先备份在使用
-n
如果没有-n,会输出两遍
-e的格式
sed -n -e '=;p' tt.txt #一条-e可以不加而写在一起,中间用;隔开
sed -n -e '=' -e 'p' tt.txt #两条时则必须要加
-i指令,直接在原文件上覆盖(慎用!!)
使用sed配合“i”指令用时,一定需要谨慎使用,这是直接对文本进行修改,最好备份一下再使用,防止原文件被直接覆盖导致事故!!!
3.2常用操作
s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行,上面插入一行指定内容。
c: 替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p: 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用
3.3使用地址来打印
sed编辑器有2种寻址方式(数字形式及文本模式):
1、以数字形式表示行区间
打印第一行
sed -n '1p' tt.txt
sed -n '1=;1p' tt.txt
打印最后一行
sed -n '$p' tt.txt
sed -n '$=;$p' tt.txt
打印1-4行的内容
sed -n '1,4p' tt.txt
打印4到最后一行
sed -n '4,$p' tt.txt
打印4及后面的一行
sed -n '4,+1p' tt.txt
打印前四行并且退出
打印奇数行:'p;n’在第一行打印后,自动跳到到下一行,第二次执行命令的时候是在第三行了
sed -n 'p;n' tt.txt
打印偶数行:'n;p’第一行直接空行,直接在第二行打印,第二次执行,直接跳到第三行,在第四行打印
sed -n 'n;p' tt.txt
sed -n '2,$n;p' tt.txt #从第二行开始,n移动下一行,p打印,表示打印奇数行
由2开始,第二行n跳过,第三行p打印。
2、用文本模式来过滤出行
sed -n ' /user/p' /etc/passwd #//搜索包含user的行进行打印,区分大小写
sed -n ' /^a/p' /etc/passwd #搜索以a开头的行进行打印
sed -n '/bash$/p' /etc/passwd #打印以bash结尾的行
sed -n '/ftp\\|root/p' /etc/passwd #搜索包含ftp或者root的行进行打印
sed -n '2,/nobody/p' /etc/passwd #从第二行开始打印到包含nobody的行
sed -nr '/ro1,t/p' /etc/passwd #-r表示支持正则表达式
3.4删除行
sed 'd' tt.txt #不指定行号,全部删除
sed '/nologin$/d' /etc/passwd #删除包含nologin字符的行
sed '/nologin$/!d' /etc/passwd #不删除包含nologin的行
从字符串为2的位置删到字符串为3的位置
注意:只要再包含开启删除的字符串就又开启了删除功能了,因此使用此功能需要特别注意。 否则会误删后续匹配字段的行
3.5替换
行范围 s/旧字符 /新字符 /替换标记
4种替换标记
数字:表明新字符串将替换第几处匹配的地方
g:表明新字符将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写到文件中
sed -n 's/root/admin/p' /etc/passwd #将匹配行的第一个root更改为admin
sed -n 's/root/admin/2p' /etc/passwd #将匹配行的第二个root更改为admin
sed -n 's/root/admin/gp' /etc/passwd #将匹配行的所有root更改为admin
sed '1,20 s/^/#/' /etc/passwd #1-20行行首添加#号
3.6从脚本文件中读取命令
我在tt2.sed脚本里写入命令,再直接读取脚本进行执行
sed -f tt2.sed tt2.txt #直接读取tt2.sed脚本里的命令进行执行
sed '1,20w out.txt' /etc/passwd #将passwd中1-20的内容保存到out.txt文件中
sed -n 's/\\bin\\/bash\\/bin\\/csh/p' /etc/passwd #把以/bin/bash的部分全部更换为/bin/csh。注意这里的\\是转义符,目的是为了使/单纯的作为符号使用
sed命令中 ! 可以代替/ 表示分隔符
3.7插入
sed '/555/c ABC' tt2.txt
sed '1,3a PP' tt2.txt #1-3行每行都下插入P
在某行上面插入一行内容
一般用于加在首行
sed 'li aa' tt2.txt #在首行插入一行
sed '2i AA' tt2.txt #在第二行插入一行
sed '5r /etc/resolv.conf' 123.txt #在第五行后导入该文件内容
sed '/root/H;d;$G' /etc/passwd #将包含root的行剪切到末尾。H表示复制到剪切板,d删除。
# G表示粘贴到指定行后。
sed '1,2H;3,4G' /etc/passwd #将1和2行的内容,复制到3行后面及4行后面。
以上是关于Linux文件处理--sed 编辑器常用介绍及案例的主要内容,如果未能解决你的问题,请参考以下文章