shell(1):sed
0、常用
1)删除sh脚本中的缩进符号
sed -i 's/\r$//' test.sh
\r$代表每行尾部的制表符。
2)将某行内容保存到变量中
line=`sed -n 2p a.txt`
3)循环处理每行
n=`wc -l a.txt | awk '{print $1}'` for i in `seq 1 $n` do #如果要在``中正确表示变量,需要用双引号 line=`seq -n "$i"p a.txt` #对line的处理 echo line done
1、用法
sed [选项] '动作' 文件名
2、作用
sed用于将数据进行选取、替换、删除、新增的命令。
3、选项与动作
选项 |
说明 |
-e | 允许对输入数据用多条sed命令编辑 |
-f 脚本文件 | 从sed脚本中读入sed操作。类似awk的-f |
-i | 用sed的结果修改原文件,而非从屏幕输出 |
-n |
一般sed命令会把所有数据都输出到屏幕 加入该项之后,只会把经过sed命令处理的行输出到屏幕 |
-r | 在sed中支持扩展正则表达式 |
动作 |
说明 |
c str |
替换,用c后的字符串替换原数据行。 替换多行时,除最后一行外,每行末尾都要用"'代表数据未完结 |
d | 删除指定行 |
num a |
追加,在当前行后添加一行或多行。 添加多行时,除最后一行外,每行末尾需要用"\"代表未完结。 num表示第几行 例如(sed 6a hello\world)会在6行后添加两行hello和world,行与行间用\区分 |
num i |
插入,在当前行前插入一行或多行。 插入多行时,除了最后一行外,每行末尾要用"\"代表未完结。 num表示第几行 |
p | 打印指定行 |
s |
字串替换,用新串替换旧串(配合-i选项可以实现将文件中的字符串批量替换)。 格式:"行范围/旧字串/新字串/g" "行范围#旧字串#新字串#g" |
在用s进行替换时除了正常文本替换之外,还可以用正则表达式或者一些特殊的格式(如下)。
输出格式 |
说明 |
\a | 输出警告声音 |
\b | 输出退格键 |
\f | 清除屏幕 |
\n | 换行 |
\r | 回车 |
\t | 水平输出TAB |
\v | 垂直输出TAB |
4、说明
sed所作的修改不会影响文件自身内容(如果是管道,则连文件都没有),而是把输出结果显示到屏幕上,除非使用"-i"选项才会直接修改文件。
5、例子
先对/etc/passwd进行调整,构造一个passwd2
①打印——p
#想看某行(会把某行重复显示,同时会显示全部行): sed '2p' passwd2 root x 0 0 root /root /bin/bash bin x 1 1 bin /bin /sbin/nologin bin x 1 1 bin /bin /sbin/nologin daemon x 2 2 daemon /sbin /sbin/nologin ... #指定输出某行,选项-n sed -n '2p' passwd2 bin x 1 1 bin /bin /sbin/nologin
②删除——d
a)删除2和4行并显示全部
sed '2,4d' passwd2
b)删除某个含有关键字行
sed -i '/word/d' t.txt
③追加、插入
行后追加一行——a
sed '2a hello' student.txt
行前追加一行——i
sed '2i hello' student.txt
如果要插入或者追加多行数据(就是说要插入的字符串是一个多行字符串)
④整行替换——c
sed '2c No data' passwd2
⑤字符串替换(部分替换)——s
sed 's/旧串/新串/g' 文件名 sed '行范围s/旧串/新串/g' 文件名
sed 's#旧串#新串#g' 文件名
使用-i选项,会将文件中的旧串替换为新串。
sed -i 's#LOG_DIR#$LOG_DIR#g' nginx.conf
将nginx.conf中的所有字符串LOG_DIR替换为变量$LOG_DIR的值。
a)把前十行的bin全部替换为nib
[root@rhel1 ~]# head -n 10 passwd2
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 lp x 4 7 lp /var/spool/lpd /sbin/nologin sync x 5 0 sync /sbin /bin/sync shutdown x 6 0 shutdown /sbin /sbin/shutdown halt x 7 0 halt /sbin /sbin/halt mail x 8 12 mail /var/spool/mail /sbin/nologin operator x 11 0 operator /root /sbin/nologin
sed '1,10s/bin/nib/g' passwd2
↑ ↑ ↑
被替换 替换后 修改的文件 root x 0 0 root /root /nib/bash nib x 1 1 nib /nib /snib/nologin daemon x 2 2 daemon /snib /snib/nologin adm x 3 4 adm /var/adm /snib/nologin lp x 4 7 lp /var/spool/lpd /snib/nologin sync x 5 0 sync /snib /nib/sync shutdown x 6 0 shutdown /snib /snib/shutdown halt x 7 0 halt /snib /snib/halt mail x 8 12 mail /var/spool/mail /snib/nologin operator x 11 0 operator /root /snib/nologin
2)一次替换多个:在一个' '中,写两个用;分隔的替换规则:
sed -e 's/bin/nib/g ; s/nologin/login/g' passwd2
3)正则,例如:把第二行注释掉
sed '2s/^/#/g' student.txt #这里使用正则表达式,^代表行首
4)先定位再替换
先定位到包含关键字swap的行,再把该行行首加#
sed -i -r '/swap/s/^/#/' /etc/fstab
上文单引号内的内容其实是两部分:第一部分/swap/代表行匹配,只有包含swap的行才会被选中;第二部分s/^/#才是执行的动作,即把行首加#。
综合起来就是选中包含swap的行,在这些行行首加#。
5)sed -i 's/\r$//g' 文件
作用:替换文件每行末尾的\r,即Windows回车符;
有些在Windows进行操作的文件,放到Linux系统下,会在每行末尾多出来一个\r(实际上是由于换行符从\r\n变为了\n,而\n自动显示为格式上的换行,导致\r成为了每行末尾显式出现的符号),这一句话的作用就是把这个\r给删除。
⑤修改文件内容——指令i(区别于插入的动作i)
sed -i '2c No data' passwd2
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性