Sed 命令

2023-11-24 09:19:44 浏览数 (3)

一、sed编辑器

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

1.工作流程

sed工作流程主要包括读取、执行和显示三个过程:

读取:sed从 输入流 (文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)

执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的位置,否则 sed 命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

2.命令格式

代码语言:javascript复制
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f '脚本文件' 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
 
sed -e '行号{
操作1
操作2
...
}' 文件1 文件2 ...

3.常用选项

代码语言:javascript复制
-e 或 --expression= :用指定命令来处理输入的文本文件,只有一个操作命令时可省略,
一般在执行多个操作命令使用
-f 或 --file= :用指定的脚本文件来处理输入的文本文件
-h 或 --help :显示帮助
-n ;--quiet 或 silent :禁止sed编辑器输出,但可以与 p 命令一起使用完成输出
-i :直接修改目标文本文件

4.常用操作

代码语言:javascript复制
常用操作:
s:替换,替换指定字符
d:删除,删除选定的行
a:增加,在当前行下面增加一行指定内容
i:插入,在选定行上面插入一行指定内容
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
p:打印,如果同时指定行;如果不指定行,则表示打印所有内容;
如果有非打印字符,则以ASCII码输出。通常与 -n 选项一起使用
=:打印行号
l:打印数据流中的文本和不可打印的ASCII字符
r:在指定行下面读取文件内容
w:将文件内容保存到新文件中

二、打印命令演示

1.打印文件内容

代码语言:javascript复制
#打印文件a.txt,
sed -n -e 'p' a.txt
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve



#打印要加选项-n,不加会输出一次,打印一次
sed 'p' a.txt
one
one
two
two
three
three
four
four
five
five
six
six
seven
seven
eight
eight
nine
nine
ten
ten
eleven
eleven
twelve
twelve

2.打印文件内容的行号

代码语言:javascript复制
sed -n '=' a.txt
1
2
3
4
5
6
7
8
9
10
11
12

3.打印文件内容和ASCII码

代码语言:javascript复制
sed -n 'l' a.txt
one$
two$
three$
four$
five$
six$
seven$
eight$
nine$
ten$
eleven$
twelve$

4.同时打印行号和文件内容

代码语言:javascript复制
#下面三个命令执行后效果一样
sed -n '=;p' a.txt
sed -n -e '=' -e 'p' a.txt
sed -n '
> =
> p
> ' a.txt
1
one
2
two
3
three
4
four
5
five
6
six
7
seven
8
eight
9
nine
10
ten
11
eleven
12
twelve

三、指定内容打印

sed编辑器有2种寻址方式:

  • 以数字形式表现行区间
  • 用文本模式过滤行

1.以数字形式过滤行

代码语言:javascript复制
#打印文件第一行内容
sed -n '1p' a.txt
one
#打印文件最后一行内容
sed -n '$p' a.txt
twelve
#打印文件2-4行内容
sed -n '2,4p' a.txt
two
three
four
#打印文件第9行到最后一行内容
sed -n '9,$p' a.txt
nine
ten
eleven
twelve
#打印第1行及其后3行内容
sed -n '1, 3p' a.txt
one
two
three
four
#输出到第4行内容退出,相当于打印前4行内容
sed '4q' a.txt
one
two
three
four

2.隔行打印文件内容

代码语言:javascript复制
#打印偶数行内容。 n :移动到下一行
#sed是一行行读,sed先执行n,然后再打印
sed -n 'n;p' a.txt
two
four
six
eight
ten
twelve
#打印奇数行内容
sed -n 'p;n' a.txt
one
three
five
seven
nine
eleven
#从第二行开始,先执行n,后执行p
sed -n '2,${n;p}' a.txt
three
five
seven
nine
eleven

3.文本过滤行内容

代码语言:javascript复制
#打印含有字符 n 的行内容
sed -n '/n/p' a.txt
one
seven
nine
ten
eleven
#打印以字母 o 开头的行内容
sed -n '/^o/p' a.txt
one
#打印以字母 n 结尾的行内容
sed -n '/n$/p' a.txt
seven
ten
eleven
#打印以字母 o 开头或以字母 n 结尾的行内容
# 管道符 ‘|’ 是扩展正则,所有要加上 -r 选项
sed -nr '/^o|n$/p' a.txt
one
seven
ten
eleven
#打印从第2行到以 s 开头的行内容
sed -n '2,/^s/p' a.txt
two
three
four
five
six
#选项 -r 支持正则。
sed -nr '/t.{1,}e/p' a.txt
three
twelve

四、删除行

1.通过行号删除

代码语言:javascript复制
sed 'd' a.txt      #删除所有行
sed '/^$/d' a.txt  #删除空行
sed '3d' a.txt     #删除第3行
one
two
four
five
six
seven
eight
nine
ten
eleven
twelve
#删除3-9行
sed '3,9d' a.txt  
two
ten
eleven
twelve
#删除最后一行
sed '$d' a.txt    
one
two
three
four
five
six
seven
eight
nine
ten
eleven

2.匹配文件内容删除

代码语言:javascript复制
sed -r '/^t|n$/d' a.txt   #删除以 t 开头或以 n 结尾的行内容
one
four
five
six
eight
nine
# !表示取反,反向匹配
sed -r '/^t|n$/!d' a.txt  
two
three
seven
ten
eleven
twelve
#删除从 f 开头的行到以 n 开头的行内容,删除了four到nine的内容
sed '/^f/,/^n/d' a.txt
one
two
three
ten
eleven
twelve
#sed编辑器会重复删除符合内容,
#当匹配到从 t 开头的行会执行删除操作,直到找到以 e 开头的行。
sed '/^t/,/^e/d' a.txt
one
nine

五、替换操作

1.替换指定字符串

代码语言:javascript复制
#将root字符替换成123,默认替换匹配的第1个字符
sed -n 's/root/123/p' passwd
123:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/123:/sbin/nologin

#加上数字2,替换匹配到的第2个字符
sed -n 's/root/123/2p' passwd
root:x:0:0:123:/root:/bin/bash

# g :替换所有符合要求的字符串
sed -n 's/root/123/gp' passwd
123:x:0:0:123:/123:/bin/bash
operator:x:11:0:operator:/123:/sbin/nologin


#查看前4行
head -4 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


#注释到1-4行,将每行的开头空字符替换成 # 号
sed -n '1,4 s/^/#/p' passwd
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin

2.将行内容替换为指定内容

代码语言:javascript复制
#将以 t 开头的行内容替换成 ABC
sed '/^t/c ABC' a.txt
one
ABC
ABC
four
five
six
seven
eight
nine
ABC
eleven
ABC

 3.将替换内容保存新文件中

代码语言:javascript复制
# w :将指定行内容保存到新文件中
sed '1,5 s/^/#/w b.txt' a.txt
#one
#two
#three
#four
#five
six
seven
eight
nine
ten
eleven
twelve
cat b.txt
#one
#two
#three
#four
#five

4.替换操作的分隔符

代码语言:javascript复制
#更改替换分隔符为 e ;默认分隔符为 /
sed 'seee1eg' a.txt
on1
two
thr11
four
fiv1
six
s1v1n
1ight
nin1
t1n
1l1v1n
tw1lv1
#更改替换分隔符为 9
sed 's9e919g' a.txt
on1
two
thr11
four
fiv1
six
s1v1n
1ight
nin1
t1n
1l1v1n
tw1lv1

5.字符转换

代码语言:javascript复制
#替换前后字符长度相同
#将 n 替换为 1;将 e 替换为 2
sed 'y/ne/12/' a.txt
o12
two
thr22
four
fiv2
six
s2v21
2ight
1i12
t21
2l2v21
tw2lv2

六、在文件中插入内容

1.在指定行下面插入内容

代码语言:javascript复制
sed '1,3a 123' a.txt
one
123
two
123
three
123
four
five
six
seven
eight
nine
ten
eleven
twelve
#在所有行下添加内容
sed 'a 123' a.txt
one
123
two
123
three
123
four
123
five
123
six
123
seven
123
eight
123
nine
123
ten
123
eleven
123
twelve
123

2.在指定行上面插入内容

代码语言:javascript复制
sed '1,3i 123' a.txt
123
one
123
two
123
three
four
five
six
seven
eight
nine
ten
eleven
twelve

3.剪切内容

代码语言:javascript复制
#将文件1-3行剪切到文件最后
sed '1,3{H;d};$G' a.txt
four
five
six
seven
eight
nine
ten
eleven
twelve
 
one
two
three

4.复制文件内容

代码语言:javascript复制
#将1-3行内容复制到第4行后面
sed '1,3H;4G' a.txt
one
two
three
four
 
one
two
three
five
six
seven
eight
nine
ten
eleven
twelve

七、直接修改原文件内容

代码语言:javascript复制
#选项 -i :直接修改原文件内容
sed -i 's/one/123/' a.txt
cat a.txt
123
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

八、使用脚本文件执行操作

代码语言:javascript复制
vim a.sh
#将操作写入脚本文件
s/two/234/
s/three/345/
#选项 -f 直接使用脚本文件对文件进行修改
sed -f 'a.sh' a.txt
123
234
345
four
five
six
seven
eight
nine
ten
eleven
twelve

九、将字符位置互换

代码语言:javascript复制
#将字符11和33互换位置
echo '112233' | sed -r 's/(11)(22)(33)/321/' 
332211
#将首字符 1 与最后字符 3 互换位置
echo '112233' | sed -r 's/^(.)(. )(.)$/321/' 
312231

十、将字符位置互换

1.删除匹配行的上一行和下一行:

代码语言:javascript复制
sed -i -e '/string/n;d' -e '$!N;/n.*string/!P;D' filename 

2.删除匹配到特定字符所在行的上一行

代码语言:javascript复制
sed -i -e '$!N;/n.*string/!P;D' filename

3.删除匹配到特定字符所在行的下一行

代码语言:javascript复制
sed -i -e ‘/string/n;d‘ filename

4.sed中使用变量,删除匹配行的上一行和下一行:

代码语言:javascript复制
AA=string     #变量指定匹配字符串
sed -i -e '/'"$AA"'$/n;d' -e '$!N;/n.*‘"$AA"'$/!P;D' file

二 匹配到字符串所在的行的上一行或者是下一行插入一条数据

a 追加内容 sed ‘/匹配词/a要加入的内容’ example.file(将内容追加到匹配的目标行的下一行位置)

i 插入内容 sed ‘/匹配词/i要加入的内容’ example.file 将内容插入到匹配的行目标的上一行位置)

例:

把文件的包含“chengyongxu.com”这个关键词的行前或行后加入一行,内容为“allow chengyongxu.cn”

代码语言:javascript复制
1   #行前加
2   sed -i ‘/allow chengyongxu.com/iallow chengyongxu.cn‘ the.conf.file
3   #行前后
4   sed -i ‘/allow chengyongxu.com/aallow chengyongxu.cn‘ the.conf.file

1.给匹配到文件中具体的字符串的下一行插入一行数据:

代码语言:javascript复制
sed -i ‘/listen/a   listen 80;‘   filename

2.在匹配到特定字符串的某行后批量插入多行数据:

代码语言:javascript复制
sed -i ‘/syncsendmsg.php/a#013.平台广告小时计划每5分钟写入主平台 xxx 2019-07-04n*/5 * * * * /usr/bin/php /data/cron/ptask/countjs_syc_plan_main.phpn*/5 * * * * /usr/bin/php /data/cron/ptask/countjs_syc_plan_h_main.php‘  filename

3.给匹配到文件中具体的字符串的上一行插入一行数据:

代码语言:javascript复制
sed -i ‘/listen/i   listen 80;‘ filename

三:删除匹配到指定字符串所在的行的上一行或者是下一行数据

1、删除指定行的上一行

代码语言:javascript复制
sed -i -e :a -e ‘$!N;s/.*n(.*ServerName abc.com)/1/;ta‘ -e ‘P;D‘ file
例:
[[email protected]_82_178_centos vhost]# grep listen m.afpfpm.cn443.conf 
   listen 80;
   listen       443;

删除   listen       443;这一行的上行内容:    listen 80;
sed -i -e :a -e ‘$!N;s/.*n(.*listen       443)/1/;ta‘ -e ‘P;D‘ m.afpfpm.cn443.conf

2、删除指定字符串之间的内容

代码语言:javascript复制
sed -i ‘/ServerName abc.com/,//VirtualHost/d‘ $file

http://www.linuxso.com/shell/17542.html

生产中nginx配置文件替换字符
sed -i ‘s/#fastcgi_pass/fastcgi_pass/g;s/fastcgi_pass  unix:/dev/shm/php-cgi.sock/#fastcgi_pass  unix:/dev/shm/php-cgi.sock/g‘  m.6saeq.cn443.conf
sed

0 人点赞