参考文章:http://linux.51yip.com/search/sed #这里的缓冲区指pattern space,模板块指的是hold space
参考文章:https://coolshell.cn/articles/9104.html#重要!!
参考文章:https://www.cnblogs.com/along21/p/10366886.html#更详细
一、概述
sed是一门文本处理的语言,可以通过逐行处理并结合正则表达式的方法进行文本的高效处理,其工作模式为,将整个文本文件读入后,将其逐行读入模式空间(pattern space),然后在该空间中对该行进行command处理,最后将处理结果输出至标准输出。其特点在于,1、可以灵活处理各种文本,支持正则表达式 2、代码简单易懂,command简洁,逻辑清晰 3、不做特殊要求下,不会对原文件直接修改,同时可以对输出结果做重定向 4、可以同时对多个文件做处理
二、基本逻辑
1、命令概述:sed [options] command file(s)
1.1 sed的核心要义是command,其核心语法逻辑为[address[,address]][!]{cmd} ,感觉理解了这句话,sed基本就学会80%~90%了。
1.2 对上述用中国话说一下
提前定义
行:行号或者符合正则的行
cmd:指代sed语法中的命令或者正则
行 {cmd} #对某一行执行cmd
^,行{cmd} #对第一行到某一行执行cmd
行,${cmd} #对某一行到最后一行执行cmd
行1,行2{cmd} #对行1到行2执行cmd
{cmd} #对所有行执行cmd(一般是s////g这样的替换)
行!{cmd} #对某一行不执行cmd,其他行都执行
行1,行2!{cmd} #对行1到行2不执行cmd,其它都执行
行{cmd1;cmd2;cmd3} #对某一行依次执行三个命令
行{cmd;{cmd2{cmd3}}} #同上
2、几个概念
2.1 pattern space
是指行导入的虚拟变量,通过使用函数对该变量做处理,在通过该变量输出结果,其中-n命令可以阻止输出pattern space 的结果,伪代码如下
foreach line in file {
//放入把行Pattern_Space
Pattern_Space <= line;
// 对每个pattern space执行sed命令
Pattern_Space <= EXEC(sed_cmd, Pattern_Space);
// 如果没有指定 -n 则输出处理后的Pattern_Space
if (sed option hasn't "-n") {
print Pattern_Space
}
}
2.2 address
指行或正则匹配的行,因此可以是数字也可以正则表达式,表示command作用的对象,如果没有address,则默认对所有行处理,伪代码如下
bool bexec = false
foreach line in file {
if ( match(address1) ){
bexec = true;
}
if ( bexec == true) {
EXEC(sed_cmd);
}
if ( match (address2) ) {
bexec = false;
}
}
2.3 命令打包
是指command可以是多个,通过分号分开或使用大括号括起来表示嵌套,或者使用-e参数进行分开
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam
# 对3行到第6行,执行命令/This/d
$ sed '3,6 {/This/d}' pets.txt
This is my cat
my cat's name is betty
my dog's name is frank
my fish's name is george
This is my goat
my goat's name is adam
# 对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令
$ sed '3,6 {/This/{/fish/d}}' pets.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
my fish's name is george
This is my goat
my goat's name is adam
# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt
my cat's name is betty
my dog's name is frank
my fish's name is george
my goat's name is adam
2.4 Hold Space
是指支持部分命令的除了pattern space的另一个空间,用于通过命令与模式空间实现交互
g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后
h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H: 将pattern space中的内容append到hold space\n后
x: 交换pattern space和hold space的内容
具体使用可以参考原文的图!
三、参数、命令及实例
3.1常用参数
-n 不输出pattern space ,一般与命令p连用
-e 后接command sed -e com1 -e com2 -e com3 file
-f 后接脚本文件 sed -f script.file file
-i 直接对原文件进行修改,不做标准输出!慎用!
3.2 常用命令
s命令:替换符合的字符
s/^ *// #去掉行开头的空格
s/name/my name/1 #对该行第一次匹配name的字符替换为my name
s/name/my name/ #效果如上,s默认每行只匹配一次
s/name/my name/3g #对该行第三个及之后的name替换为my name
s/name/my name/g #对该行中的name完全替换为my name
g命令:如上所述,可以实现完全匹配
N命令:把下一行的内容与该行(模式空间)合并一起做匹配
N;s/\n// #将行之间的回车删掉
a命令:append,指在该行(模式空间)的下面新建一行并插入字符
1 a this is a dog #在该行(第一行)的下面新建并插入this is a dog
i命令:insert ,在该行上一行新建并插入
c命令:替换匹配行
/home/ c this is my home #将有home的那一行替换为this is my home
d命令:删除行
/home/d #将有home的那一行删除
p命令:打印匹配行,通常与n连用
/home/p #将有home的行打印出来
=命令 :显示行号
/home/= #显示存在home的行号
其它命令:如支持hold pattern的那些命令
3.3 特殊符号
3.3.1 & :用来表示匹配到的某一个字符,可以与s连用
s/home/[&]/g #将每行的home替换为[home]
3.3.2 括号 :与\1 \2 配合使用,圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…
sed 's/This is my ([^,&]),.is (.*)/\1:\2/g' my.txt #将()中匹配的值赋值给\1和\2,注意中间有冒号,本例中用来做替换操作
四、常见组合
命令s与g : 实现行内匹配的字符全部替换,注:s默认每行只替换一次,与g连用可以多次替换
命令p与参数n:只输出符合正则的行,执行逻辑为先判定n再执行p sed -n '/name/p' pets.txt
网友评论