Sed的基本用法
概念及作用
sed和grep类似,也是一种文件编辑器
sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。
sed主要用来自动编辑一个或多个文件,可以将数据进行增删改查等特定工作,简化对文件的反复操作.
格式
sed [参数] ‘命令’ 文件
参数
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容,(没有备份时慎重操作);
-n :只打印模式匹配的行,与grep相似
-r :支持扩展表达式;
命令
a\ 在当前行下面插入文本;
i\ 在当前行上面插入文本;
c\ 把当前行改为新的文本;
d 删除,将选择的内容删除
D 删除模板第一行
s 替换指定字符 (最常用)
p 打印模板块的行。(常常和 -n配合使用)
P 打印模板块的第一行;
标记
g 表示行内全部替换,ng表示第n个匹配的开始进行替换
w 表示把行写入一个文件
\1 字串匹配标记(划重点)
& 已匹配字符串标记
部分测试
1. 替换
echo book | sed 's/book/books/'
将book替换为books
先将777和test写入到cs文件中,然后使用 sed命令将test替换为TEST,再用-n p 组合查看
sed 's/test/TEST/' cs
sed -n 's/test/TEST/p' cs
可以看到,通过使用-n p 运行sed之后就只显示经过修改的结果.
2. 全局替换
echo sksksksksksk | sed 's/sk/SK/ng'
这里能看出g的作用,
当n=1时,这段代码就是将每一个sk替换为SK,
为2时,从第二个开始的sk换为SK
以此类推
ng就是从第n个开始,将字符进行替换
3. 删除
拷贝一份passwd,添加几个空行
sed '/^$/d' passwd | head -10
删除空白行
接着对没有空白行的文本进行操作
删除第二行
sed '2d' passwd
sed '2,$d' passwd
删除第二行之后的所有(包括第二行)
从这里可以发现’n,md’是删除n-m行(包括n和m)
字符串标记
在正则中,用\w\+
匹配每一个单词
在sed中,&则表示匹配到的字符
echo "this is a test line" | sed 's/\w\+/[&]/g'
这个命令用来给匹配到的每一个单词加上[]
子串匹配(重点)
我们假定a b c d
为一个字符串,那么a
b
c
d
则为 a b c d
的四个子串
在搞懂这个概念之后,进行如下命令
echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4/'
这一段命令是分别匹配了a b c d
的四个子串,然后输出第四个子串
echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4\3\2\1/'
而这一段命令则是将匹配的子串倒序输出,且中间没有隔断
echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4,\3,\2,\1/'
这一段则是用’,'隔开
对子串进行一个剖析
这后面的\4\3\2\1分别对应子串4,子串3 ,子串2,子串1
另外,子串的匹配方式应和原文本保持一致,不然会匹配不到
选定范围
在sed中,范围的用’,(逗号)’
例如我们前面的删除第二行之后的所有就用了2-$
($和以前一样,表示结尾,同样^和以前一样表示开头)
在passwd中添加一行test
打印从第5行开始一直到第一个以test开头的行之间的所有内容
sed -n '5,/^test/p' passwd
追加
追加分为行上(a),行下(i),本行
行上追加
就是在匹配到的行前面一行进行追加操作
sed '/^test/i\777' passwd
在以test开头的行前追加 ‘777’
行下追加
在匹配到的行下面一行进行追加
sed '/^test/a\777' passwd
这里是在以test开头的行下面一行追加777
本行追加
本行追加又有在匹配到的字符后直接追加和在行尾追加两种
- 字符后追加
sed 's/^test/&777/' passwd
这里使用了&代表匹配到的test
- 在行末追加
sed '/test/s/$/777/' passwd
这里是先对test匹配,然后在末尾使用替换命令,就可以完成在行末追加内容的操作
各种正则也适用于sed表达式
sed主要用于文件的行处理,列处理我们常用的是awk,后面还会对awk进行学习