Linux中sed命令使用大全

Linux中sed命令使用大全

        sed编辑器是一种流式编辑器,与常见的交互式文本编辑器相反,交互式文本编辑器比如vim,可以通过键盘来交互式插入,删除文本,替换文本,流试编辑器会在编辑器处理数据之前预先提供一组规则编辑数据流。废话少说,直接看用法。

需要强调的是,sed命令不会改变源文件的内容

1.1 sed命令格式

sed options script file

其中options有:

-e script 处理输入时,将script中指定命令添加到已经有的命令中

-f file 在处理时,将file中指定命令添加到已有的命令中

-n 不产生输出,使用print命令完成输出

sed的替换命令

echo "This is a test " | sed ‘s/test/big test/’

[Click and drag to move]

上述命令输出的结果是:

This is a big test

解释:sed 使用s命令表示替换,会将斜线间指定的第二个字符串代替第一个字符串,本例子中的使用big test 替换 test

千万要注意,使用单引号将s命令中的替换包括起来,不是双引号。

如果时替换文件中的也是一样:

sed ‘s/dog/cat/’ example.txt

[Click and drag to move]

上述命令会将example.txt中的dog替换成cat

同时使用多个命令

使用多个命令,使用-e选项就可以。

echo xx yy zz | sed -e ‘s/xx/yy/; s/zz/yy/’

[Click and drag to move]

上述结果就是yy yy yy,如果是对文件也是一样的,后面接文件名。此处时为了好演示,所以使用echo

上述需要注意的点:

1 命令之间是用;分割开来

2 多个命令是包含在一对单引号之间,不是多组

3 每个s命令要完整也就是反斜杠必须是三个,不能少,尤其最后6一个容易被忽视,不能少,不然报错

从文件中读取命令

例如有如下文件test.sed,内容如下:

s/dog/cat/
s/apple/cat/

[Click and drag to move]

使用命令如下:

echo dog cat apple | sed -f test.sed

[Click and drag to move]

得到的结果就是:

cat cat cat

sed使用-f选项来从文件中读取命令指定文件

需要注意的点:

1 文件中的多个命令不是使用;分割,而是每一行就是一个命令

2 不需要使用单引号包括起来

3 这个文件不是bash类的脚本,不需要使用!#/bin/bash 这种头文件

替换所有的

需要注意的是,默认情况下sed只是替每一行中出现的第一处,也就是说一行中有多个需要替换的,sed默认只是替换其中的第一个,如果想替换所有的,怎么弄呢?

必须要加替换标记

s/pattern/replacement/flags

[Click and drag to move]

其中替换标记有四种,

  • 1 数字,表示新文本将替换第一处模式匹配的地方

echo “xx,xx,xx” | sed ‘s/xx/yy/3’

[Click and drag to move]

结果就是:xx,xx,yy

  • 2 :g ,表示替换所有匹配到的字符串

echo “xx,xx,xx” | sed ‘s/xx/yy/g’

[Click and drag to move]

结果就是:yy,yy,yy

  • 3: p 表明原先行的内容也打印出来
echo "xx,xx,xx" | sed 's/xx/yy/p'
结果是:
yy,xx,xx
yy,xx,xx

比之前显示多了一行,常常和-n一起使用,只输出被命令替换过的行。

echo -e  "xx,xx,xx \\n zz,uu,dd\\n" | sed -n 's/xx/yy/p'
结果是:
yy,xx,xx

只是显示了被替换的行

  • 4 w file 将替换结果写入文件
echo -e  "xx,xx,xx \\n zz,uu,dd\\n" | sed -n 's/xx/yy/w' xxx.txt

替换特殊字符(/)

在替换文本中的“/”时候比较困难,这种符号常出现在路径中,如果一定要按照原来的方法做,那必须转义,

echo "/home/user/shell/" | sed 's/\/home/\/usr/'

这种虽然也可以,但是太复杂的,有简单的方法,那就是,使用其他的字符代替,使用其他字符代替分隔符,例如感叹号!

echo "/home/user/shell/" | sed 's/\/home/\/usr/'

分隔符前后两个之间的表示一个字符,用感叹号分割,比较直观。

sed 只作用于某些特定行

默认sed会作用于所有的行,如果只是想作用某特定行,那么需要添加寻行址
sed编辑器中有两种寻行址。

  • 1 以数字形式表示行区间
  • 2 用文本模式过滤
使用数字方式寻地址
echo -e  "xx,xx,xx \\nxx,xx,xx\\nxx,xx,xx" | sed  '1s/xx/yy/'

其中1s表示只替换第一行

echo -e "xx,xx,xx \\nxx,xx,xx\\nxx,xx,xx" | sed '1,3s/xx/yy/

替换1-3行是一个闭区间,这种是区间的写法

用文本模式过滤

使用正则表达试

删除命令

删除行使用d,删除特定行

echo -e  "xx,xx,xx \\nyy,yy,yy\\nzz,zz,zz" | sed '1d'
结果为:
yy,yy,yy
zz,zz,zz

删除第一行
删除区间行:

echo -e  "xx,xx,xx \\nyy,yy,yy\\nzz,zz,zz" | sed '1,2d'
结果为:
zz,zz,zz

删除从第n行到文件结尾

echo -e  "xx,xx,xx \\nyy,yy,yy\\nzz,zz,zz" | sed '2,$d'
结果为:
xx,xx,xx

插入与附加文本

插入使用 i (inset)
附加用 a (append)

插入文本

echo "xx yy zz" | sed 'i\aa bb cc'
结果为
aa bb cc
xx yy zz

需要注意,
1 i后面接的是反斜线,不是正斜线,如果写成正斜线,那么正斜线也会被当作字符输出。
2 使用插入字符串,结果是插入在文本前面

使用添加文本

echo "xx yy zz" | sed 'a\aa bb cc'
xx yy zz
aa bb cc

可以看到,使用添加文本,添加的字符串出现在文本的后面,与插入不同

插入添加到指定行

echo -e  "xx yy zz \nqq ww ee \nrr tt yy \nyy uu ii" | sed '2a\aa bb cc'
xx yy zz 
qq ww ee 
aa bb cc
rr tt yy 
yy uu ii

这里2a表示添加到第二行的后面,如果是添加到第二行的前面,使用2i。

echo -e  "xx yy zz \nqq ww ee \nrr tt yy \nyy uu ii" | sed '2i\aa bb cc'
xx yy zz 
aa bb cc
qq ww ee 
rr tt yy 
yy uu ii

插入出现在前面,添加出现在后面,指定行加上行号。插入行尾,可以使用$美元符号来表示,而不需要数到最后一行。

echo -e  "xx yy zz \nqq ww ee \nrr tt yy \nyy uu ii" | sed '$a\aa bb cc'
xx yy zz 
qq ww ee 
rr tt yy 
yy uu ii
aa bb cc

修改行

修改行使用命令c(change),与插入添加命令使用方式一样,需要指定修改的行。

echo -e  "xx yy zz \nqq ww ee \nrr tt yy \nyy uu ii" | sed '2c\aa bb cc'
xx yy zz 
aa bb cc
rr tt yy 
yy uu ii

上述的例子为修改第二行。

转换命令

转换命令y(transform),是唯一一个可以处理单个字符sed编辑命令。

y/inchars/outchars

上述是转换命令的格式。

echo -e "abc" | sed 'y/abc/123/'
123

上述例子可以看出,转换命令中的字符是一一对应的,也可以指定行转换

echo -e "abc\nbac\ncba" | sed '1y/abc/123/'
123
bac
cba

打印

  • p命令用来文本行
  • 等号用来打印行号
  • l(小写L)用来列出行

打印行

echo -e "abc" | sed 'p'
abc
abc

p命令打印sed中输出行,所以上述为两行。单独使用这个命令没啥意义。常和其他命令结合。
常和只显示模式匹配的行一起使用

echo -e "abc\nbac\ncba" | sed -n '/abc/p'
abc

-n命令禁止其他输出,刚好和p命令友好结合,只输出匹配到的行。

打印行号

 echo -e "abc\nbac\ncba" | sed '='
1
abc
2
bac
3
cba

这样行号出现在行的前面。

列出行

列出(list)命令,可以打印数据流中的文本和不可打印的ACII字符,任何不可打印的支字符要么在其八进制前加一个反斜线,要么使用标准C风格的命名法,例如:

 echo -e "abc\nbac\ncba" | sed 'l'
abc$
abc
bac$
bac
cba$
cba

他把换行符号也打印出来了。

使用sed处理文件

写入文件用w命令

echo -e "abc\nbac\ncba" | sed 'w xxx.txt'
abc
bac
cba

数据就写入了xxx.txt文件。如果是指定行写入,加入一个行号就可以。

echo -e "abc\nbac\ncba" | sed '1w xxx.txt'
abc
bac
cba

只将第一行写入文件

echo -e "abc\nbac\ncba" | sed '1,3w xxx.txt'
abc
bac
cba

将1-3行写入文件,

从文件读取数据

使用r命令(read)

sed '1r xxx.txt'  yyy.txt
wer
abc
bac
cba
zxcv
rfhebtyre

上述命令将xxx.txt中的文本插入到yyy.txt的第一行后面。
这些命令可以相互结合使用。

好了,sed命令讲解就到这里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值