最近在复习shell脚本,看到《linux命令行与shell脚本编程大全》第19章关于sed的介绍,下面作了一些用法总结。linux
sed编辑器被称做流编辑器,它和vim这种的交互式文本编辑器不一样,是根据命令来处理数据流中的数据。会执行下列操做:正则表达式
其中sed命令的能够从命令行中输入,也能够从一个命令文件中读取。shell
sed -e script 添加script中指定的命令编程
sed -f file 添加file中指定的命令vim
来看一个简单的文本替换示例:bash
echo "hi,my name is xxx" | sed 's/xxx/kinsomy/'
#修改文件
sed 's/xxx/kinsomy/' data.txt
#执行多个命令 用-e选项,分号隔开
sed 's/xxx/kinsomy/; s/***/hhh/' data.txt
复制代码
将echo输出的数据经过管道输入sed中,而后用s命令进行替换,用第二个斜杠后的数据替换掉第一个斜杠后匹配的数据。编辑器
注意:sed操做文本文件中的数据,仅仅是将修改的数据输出到STDOUT,可是并不会修改文件自己的数据spa
在一个文件script.sed
中定义一系列的命令,方便复用。命令行
s/*/a
s/x/b
s/-/+
复制代码
# -f选项指定命令文件
sed -f script.sed data.txt
复制代码
上面的例子echo "hi,my name is xxx" | sed 's/xxx/kinsomy/'
只会替换每一行中匹配到的第一个数据,可是一行数据中如有多个匹配项,则不能所有被替换掉。3d
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/'
#输出
hi,my name is kinsomy, i am xxx
复制代码
这个时候能够使用一些替换标记substitution flag来设置替换的模式。替换标记跟在替换字符串以后。
s/pattern/replacement/flags
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/2'
#输出 第二个xxx被替换成kinsomy
hi,my name is xxx, i am kinsomy
复制代码
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/g'
#输出 第二个xxx被替换成kinsomy
hi,my name is kinsomy, i am kinsomy
复制代码
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/p'
#输出
hi,my name is kinsomy, i am xxx
hi,my name is kinsomy, i am xxx
复制代码
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/w output.txt'
复制代码
上文说到sed命令是一行行读取文本,进行匹配操做数据,知道全部行被遍历完,若是这时候咱们想要对特定的行作操做就要使用行寻址。 行寻址有两种形式:
# 操做单行
$ sed '2s/xxx/***/' data.txt
# 操做必定行区间[2,4]
$ sed '2,4s/xxx/***/' data.txt
# 操做某行开始到最后[2,endline]
$ sed '2,$s/xxx/***/' data.txt
复制代码
首先在/etc/passwd内找到kinsomy的记录,而后将bash替换为csh。文本模式过滤器配合正则表达式会很强大。
sed '/kinsomy/s/bash/csh/' /etc/passwd
复制代码
使用删除命令d对文本进行删除操做。
# 删除全部文本
sed 'd' data.txt
# 删除单行
sed '2d' data.txt
# 删除行区间[2,3]
sed '2,3d' data.txt
# 删除行区间[2,endline]
sed '2,$d' data.txt
# 删除匹配文本aa的行
sed '/aa/d' data.txt
# 删除两个匹配文本之间的文本 匹配到1和3的行之间的文本所有被删除
sed '/1/,/3/d' data.txt
复制代码
# 追加
echo "Line 2" | sed 'a\
pipe quote> Line 1'
#插入
echo "Line 2" | sed 'i\
pipe quote> Line 1'
复制代码
c命令用来修改一行数据
# 修改第三行文本
sed '3c\
pipe quote> change line ' data.txt
复制代码
命令格式 sed 'y/inchar/outchar'
将inchar中的字符一一对应地转换成outchar的字符
echo "This 1 is a test of 1 try." | sed 'y/123/456/'
# 输出
This 4 is a test of 4 try.
复制代码