shell(1):sed

学习自:sed 文本选取、替换、删除、新增的命令

sed -i 命令入门详解-CSDN博客

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

复制代码

awk -F':' '{for (i=1;i<=NF;i++)printf("%s ",$i);printf("\n")}' /etc/passwd | awk '{print > "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
games x 12 100 games /usr/games /sbin/nologin
ftp x 14 50 FTP User /var/ftp /sbin/nologin
nobody x 99 99 Nobody / /sbin/nologin
systemd-network x 192 192 systemd Network Management / /sbin/nologin
dbus x 81 81 System message bus / /sbin/nologin
polkitd x 999 998 User for polkitd / /sbin/nologin
libstoragemgmt x 998 997 daemon account for libstoragemgmt /var/run/lsm /sbin/nologin
abrt x 173 173 /etc/abrt /sbin/nologin
rpc x 32 32 Rpcbind Daemon /var/lib/rpcbind /sbin/nologin
chrony x 997 994 /var/lib/chrony /sbin/nologin
tss x 59 59 Account used by the trousers package to sandbox the tcsd daemon /dev/null /sbin/nologin
geoclue x 996 993 User for geoclue /var/lib/geoclue /sbin/nologin
sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin
postfix x 89 89 /var/spool/postfix /sbin/nologin
ntp x 38 38 /etc/ntp /sbin/nologin
tcpdump x 72 72 / /sbin/nologin
vboxuser x 1000 1000 vboxuser /home/vboxuser /bin/bash
miduser x 1001 1001 /home/miduser /bin/bash

复制代码

①打印——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

 

posted @   ShineLe  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示