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命令讲解就到这里。