shell中sed的简单使用
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本/文件
常用选项:
-n∶取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来
-e∶进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑
-f∶指定sed脚本的文件名. 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作
-r∶sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)
-i∶直接修改读取的文件内容,而不是由屏幕输出
常用命令:
a ∶ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c ∶ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d ∶ 删除,因为是删除,所以 d 后面通常不接任何内容
i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p∶ 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用
s∶ 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。例如 1,20s/old/new/g
定址
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如:
sed -n '3p' datafile
只打印第三行
指定一个区间行的信息
sed -n '2,4p' datafile
地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:
sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容
删除某行
[root@localhost ruby] # sed '1d' a.txt #删除第一行
[root@localhost ruby] # sed '$d' a.txt #删除最后一行
[root@localhost ruby] # sed '1,2d' a.txt #删除第一行到第二行
[root@localhost ruby] # sed '2,$d' a.txt #删除第二行到最后一行
显示某行
[python@master2 tmp]$ sed -n '1p' a.txt #显示第一行
[python@master2 tmp]$ sed -n '$p' a.txt #显示最后一行
[python@master2 tmp]$ sed -n '1,2p' a.txt #显示第一行到第二行
[python@master2 tmp]$ sed -n '2,$p' a.txt #显示第二行到最后一行
使用模式进行查询
[python@master2 tmp]$ sed -n '/2/p' a.txt #查询包括关键字ruby所在所有行
[python@master2 tmp]$ sed -n '/\$/p' a.txt #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
增加一行或多行字符串
[python@master2 tmp]$ sed '1a drink tea' a.txt #第一行后增加字符串
1
drink tea
2
3 the $
4
5
6
7
8 the
9
[python@master2 tmp]$ sed '1,3a drink tea' a.txt #在第一行和第三行之间的行每一行之间都添加
1
drink tea
2
drink tea
3 the $
drink tea
4
5
6
7
8 the
9
[python@master2 tmp]$ sed '1a drink tea\nor coffen' a.txt #添加多行用\n来链接
1
drink tea
or coffen
2
3 the $
4
5
6
7
8 the
9
代替一行或者多行
[python@master2 tmp]$ sed '1c Hi' a.txt #第一行用Hi代替
Hi
2
3 the $
4
5
6
7
8 the
9
[python@master2 tmp]$ sed '1,2c Hi' a.txt #第一行和第二行用Hi代替
Hi
3 the $
4
5
6
7
8 the
9
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
[python@master2 tmp]$ sed -n '/the/p' a.txt |sed 's/the/bird/g' #代替
3 bird $
8 bird
[python@master2 tmp]$ sed -n '/the/p' a.txt |sed 's/the//g' #删除
3 $
8
插入
[python@master2 tmp]$ sed -i '$abye' a.txt #在最后一行添加bye
替换:
-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。
[python@master2 tmp]$ sed -e '1,3d' -e 's/the/your/g' a.txt #删除1到3行,然后the用your 代替
4
5
6
7
8 your
9
bye
# 替换两个或多个空格为一个空格
sed 's/[ ][ ]*/ /g' file_name
# 替换两个或多个空格为分隔符:
sed 's/[ ][ ]*/:/g' file_name
# 替换成空格
sed 's/[[:space:]][[:space:]]*/ /g' filename
# 替换成分隔符:
sed 's/[[:space:]][[:space:]]*/:/g' filename
基本sed编程举例:
使用p(rint)显示行: sed -n '2p' temp.txt 只显示第2行,使用选项n
打印范围: sed -n '1,3p' temp.txt 打印第1行到第3行
打印模式: sed -n '/movie/'p temp.txt 打印含movie的行
使用模式和行号查询: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n '1,$'p temp.txt $为最后一行
任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing
打印行号: sed -e '/music/=' temp.txt
删除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt
替换文本: sed 's/source/OKSTR/' temp.txt 将source替换成OKSTR
sed 's//$//g' temp.txt 将文本中所有的$符号全部删除
sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
从文件中读文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
从shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意需要使用双引号
快速一行命令:
's//.$//g' 删除以句点结尾行
'-e /abcd/d' 删除包含abcd的行
's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替
's/^[][]*//g' 删除行首空格
's//.[][]*/[]/g' 删除句号后跟两个或更多的空格,用一个空格代替
'/^$/d' 删除空行
's/^.//g' 删除第一个字符,区别 's//.//g'删除所有的句点
's/COL/(.../)//g' 删除紧跟COL的后三个字母
's/^////g' 删除路径中第一个/
替换单引号为空:
可以这样写:
sed 's/'"'"'//g'
sed 's/'\''//g'
sed s/\'//g
在文件的第一行前面插入一行abc
[python@master2 tmp]$ sed -i '1i\abc' a.txt