sed命令主要是以行为单位对数据进行处理,可以进行替换、删除、新增、选取等操作
sed命令行格式:
sed [options] 'command' filename
options常用选项[-nefri]:
-n∶取消默认输出;sed默认会输出所有文本内容,使用-n参数后只显示command处理过的行
-e∶多点编辑,允许多个脚本指令被执行。
-r∶支持扩展正则+ ? () {} |
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-i∶直接修改读取的文本内容,而不会再显示输出。
command命令选项:
command | 说明 | 示例 |
p | 打印匹配行 | sed -n '2p' filename 打印文本第一行内容;不加-n,则会先输出文本全部内容,再打印第二行内容 |
= | 显示文件行号 | |
a | 在定位行号后插入新文本信息(单独作为一行插入) | |
i | 在定位行号前插入新文本信息(单独作为一行插入) | |
d | 删除定位行 | |
s | 使用替换模式替换相应模式 | |
{} | 在定位行执行的命令组 | |
c | 用新文本替换定位文本 | |
n | 读取下一行,遇到n时会自动跳入下一行 | |
sed替换的基本语法为:
sed 's/原字符串/替换字符串/'
但是这只会替换每行匹配到的第一个关键字;如需替换匹配到的所有关键字,可以在末尾加g来操作:
sed 's/原字符串/替换字符串/g' //替换所有匹配关键字
若需将替换操作写入文本,需添加-i选项,如 sed -i 's/原字符串/替换字符串/g'
命令中s表示替换,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,例如:
sed "s/原字符串包含'/替换字符串包含'/" //要处理的字符包含单引号
命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号”?”:
sed 's?原字符串?替换字符串?' //自定义分隔符为问号
sed中正则表达式的应用:
eg:
sed -n '/^[0-9]/p' filename 表示打印文件中以任意数字开头的行
command中也可使用正则表达式进行匹配:
元字符 | 功能 | 示例 |
^ | 行首定位符 | /^my/ 匹配所有以my开头的行 |
$ | 行尾定位符 | /my$/ 匹配所有以my结尾的行 |
. | 匹配除换行符以外的单个字符 | /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行 |
* | 匹配零个或多个前导字符 | /my*/ 匹配包含字母m,后跟零个或多个y字母的行 |
[] | 匹配指定字符组内的任一字符 | /[Mm]y/ 匹配包含My或my的行 |
[^] | 匹配不在指定字符组内的任一字符 | /[^Mm]y/ 匹配包含y,但y之前的那个字符不是M或m的行 |
| 保存已匹配的字符 | 1,20s/self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。 |
& | 保存查找串以便在替换串中引用 | s/my/**&**/ 符号&代表查找串。my将被替换为**my** |
\< | 词首定位符 | /\<my/ 匹配包含以my开头的单词的行 |
\> | 词尾定位符 | /my\>/ 匹配包含以my结尾的单词的行 |
x\{m\} | 连续m个x | /9\{5\}/ 匹配包含连续5个9的行 |
x\{m,\} | 至少m个x | /9\{5,\}/ 匹配包含至少连续5个9的行 |
x\{m,n\} | 至少m个,但不超过n个x | /9\{5,7\}/ 匹配包含连续5到7个9的行 |