最近由于工作需要,开始学习Sed,虽然只学习了短短不到10个小时,对sed也算有一点入门了。
下面把我的学习笔记贡献出来
不要被超长的篇幅吓到,其实大量的都是命令返回的结果
这里列举出来的都是一些常用的操作哦~
那么我们开始吧~首先建一个文件,然后就可以练习命令了哦
使用的原始文本
=================================================
文件名:Sed_Test
文件内容
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
==================================================
编辑命令 -p选项
命令解释: 打印匹配行
[zhangyongqiao.pt@v128217:~$] sed '1p' Sed_Test #打印第一行
line 1: Hello!
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
问题及处理:只想打印第一行 "-n"参数的使用
[zhangyongqiao.pt@v128217:~$] sed -n '1p' Sed_Test #只想打印第一行
line 1: Hello!
选择打印范围
[zhangyongqiao.pt@v128217:~$] sed -n '1,2p' Sed_Test #只想打印2行
line 1: Hello!
line 2: MR.zhang
多命令 -e选项
命令解释: 多命令编辑
[zhangyongqiao.pt@v128217:~$] sed -n -e '1p' -n -e '2p' Sed_Test
line 1: Hello!
line 2: MR.zhang
编辑命令 -a选项
命令解释: 在匹配文字后追加文本行
[zhangyongqiao.pt@v128217:~$] sed '/Hello!/a\add 1 line:...' Sed_Test
line 1: Hello!
add 1 line:...
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
匹配元字符的命令 \的使用(反斜杠的使用)
命令解释:对特殊符号进行转译
[zhangyongqiao.pt@v128217:~$] sed -n '/\!/p' Sed_Test
line 1: Hello!
line 3: welcome to hangzhou !
line 4: enjoy youself!
=========================================================
注意:前文提到的“line1”的“1”与“1p”中的的“1”无关
特此在文件中追加第五行
line 5: 11111.同时做出如下操作说明:
[zhangyongqiao.pt@v128217:~$] sed'1p' Sed_Test
line 1: Hello!
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
[zhangyongqiao.pt@v128217:~$] sed -n '1p' Sed_Test
line 1: Hello!
“1p”中的1可以作为特殊字符看待。
如需要打印带1的行,可以进行如下操作
[zhangyongqiao.pt@v128217:~$] sed -n '/1/p' Sed_Test
line 1: Hello!
line 5: 11111.
=========================================================
尾行匹配符号 $的使用
命令解释:$在正则中表示尾行
[zhangyongqiao.pt@v128217:~$] sed -n '$p' Sed_Test
line 5: 11111.
注:sed基本编辑命令可以放在单引号内或者单引号外
[zhangyongqiao.pt@v128217:~$] sed -n '$'p Sed_Test
line 5: 11111.
编辑命令 c\的使用
命令解释:用新文本替换定位文本
[zhangyongqiao.pt@v128217:~$] sed '/Hello/c\OK!' Sed_Test
OK!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
编辑命令 d的使用
命令解释:删除操作
[zhangyongqiao.pt@v128217:~$] sed '/Hello/d' Sed_Test
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
同样可以这样写:
[zhangyongqiao.pt@v128217:~$] sed '1d' Sed_Test
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
此操作也支持范围操作
[zhangyongqiao.pt@v128217:~$] sed '1,3d' Sed_Test
line 4: enjoy youself!
line 5: 11111.
编辑命令 s的使用
命令解释:替换操作符
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/' Sed_Test #命令1
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/p' Sed_Test #命令2
line 1: hi!
[zhangyongqiao.pt@v128217:~$] sed 's/Hello/hi/' Sed_Test #命令3
line 1: hi!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
[zhangyongqiao.pt@v128217:~$] sed 's/Hello/hi/p' Sed_Test #命令4
line 1: hi!
line 1: hi!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
注:上面是连续的四条命令
这里可以做分析
sed -n 's/Hello/hi/' Sed_Test 表示将文件Sed_Test中的Hello替换成hi,同时不打印修改了的文件
sed -n 's/Hello/hi/p' Sed_Test 表示将文件Sed_Test中的Hello替换成hi,同时打印修改了的文件的修改部分
sed 's/Hello/hi/' Sed_Test 表示将文件Sed_Test中的Hello替换成hi,同时打印修改了的文件的全部内容
sed 's/Hello/hi/p' Sed_Test 表示将文件Sed_Test中的Hello替换成hi,同时打印修改了的文件的修改内容和,修改了的文件的全部内容
编辑命令 g的使用
命令解释 对替换操作的补充,替换文本中所有出现需要被替换之处
========================================================
这里加入lin6:内容为:
[zhangyongqiao.pt@v128217:~$] sed -n '6p' Sed_Test
line 6: Hello!Hello!
========================================================
做s替换处理
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/p' Sed_Test
line 1: hi!
line 6: hi!Hello!
这里line6 的第二个Hello实际是没有被替换的
然后再做g处理:
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/pg' Sed_Test
line 1: hi!
line 6: hi!hi!
很直观的看出对所有需要替换的部分进行了替换
=========================================================
补充:
替换匹配行第N次被匹配到的字符串的操作如下:
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/1p' Sed_Test
line 1: hi!
line 6: hi!Hello!
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/2p' Sed_Test
line 6: Hello!hi!
=========================================================
编辑命令 w选项
命令解释:将之前的操作的输出写到w后追加的文件中,如果文件未曾建立,则自动建立
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/hi/w output' Sed_Test
[zhangyongqiao.pt@v128217:~$] cat output
1 line 1: hi!
2 line 6: hi!Hello!
w操作也可以这样用
[zhangyongqiao.pt@v128217:~$] sed -n '1 w output' Sed_Test
[zhangyongqiao.pt@v128217:~$] cat output
line 1: Hello!
常用符号 &
命令解释:保存被替换的字符串以供使用
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/(&)/pg' Sed_Test
line 1: (Hello)!
line 6: (Hello)!(Hello)!
[zhangyongqiao.pt@v128217:~$] sed -n 's/Hello/(Hello)/pg' Sed_Test
line 1: (Hello)!
line 6: (Hello)!(Hello)!
编辑命令 r选项
命令解释:将r后面所带的文件的内容加入到指定的字符串所在行的后面
[zhangyongqiao.pt@v128217:~$] cat output
outputfile_message line 1
[zhangyongqiao.pt@v128217:~$] sed '/Hello!/r output' Sed_Test
line 1: Hello!
outputfile_message line 1
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
outputfile_message line 1
退出命令 q选项
命令解释:当完成一次操作后就退出
[zhangyongqiao.pt@v128217:~$] sed '/Hello/p' Sed_Test
line 1: Hello!
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
line 6: Hello!Hello!
[zhangyongqiao.pt@v128217:~$] sed '/Hello/q' Sed_Test
line 1: Hello!
========================================================
Sed相当于对指定文件做for循环,而引号里面的内容则是循环体
这里的q则相当于break
========================================================
变换命令 y选项
命令解释:将一系列的字符变换成相应的字符,对字符做逐个处理
[zhangyongqiao.pt@v128217:~$] cat Sed_Test
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
[zhangyongqiao.pt@v128217:~$] sed 'y/Hello/happy/' Sed_Test
pina 1: happy!
pina 2: MR.zhang
pina 3: wapcyma ty hangzhyu !
pina 4: anjyy yyusapf!
pina 5: 11111.
pina 6: happy!happy!
========================================================
所谓的对字符做逐个处理,也就是说不将Hello作为一个字符串
而是对Hello视为H,e,l,l,o
这里的替换效果相当于
[zhangyongqiao.pt@v128217:~$] sed 'y/Helo/hapy/' Sed_Test
pina 1: happy!
pina 2: MR.zhang
pina 3: wapcyma ty hangzhyu !
pina 4: anjyy yyusapf!
pina 5: 11111.
pina 6: happy!happy!
========================================================
显示控制字符 r命令
命令解释:显示文件中的控制字符【也就是文件中的换行,TAB等】
========================================================
新建文件control
输入内容
aaa #aaa后面有个tab字符
========================================================
[zhangyongqiao.pt@v128217:~$] cat control
aaa
[zhangyongqiao.pt@v128217:~$] sed -n '1,2l' control
$
aaa $
命令组 {}
命令解释:在定位行执行命令组操作
[zhangyongqiao.pt@v128217:~$] sed -n '/Hello/{=;p;s/H/h/;p;s/H/h/g;p}' Sed_Test
1
line 1: Hello!
line 1: hello!
line 1: hello!
6
line 6: Hello!Hello!
line 6: hello!Hello!
line 6: hello!hello!
[zhangyongqiao.pt@v128217:~$] sed -n '/Hello/{=;p;s/H/h/g;p;s/H/h/;p}' Sed_Test
1
line 1: Hello!
line 1: hello!
line 1: hello!
6
line 6: Hello!Hello!
line 6: hello!hello!
line 6: hello!hello!
=======================================================
上面采用2组命令作对比,很容易看出了sed的操作流程,
也就是前文说的循环。同时对比倒数第二行
line 6: hello!Hello!
line 6: hello!hello!
********************
line 6: hello!hello!
line 6: hello!hello!
发现sed对前一操作的结果是保留的。
这里可以解释为
Sed命令并非是执行一条指令就释放一次
而是先将指定文件的内容读入内存,然后对内存中的数据做update,
当整个sed执行完之后才将文件内容对应的内存块释放
=======================================================
处理命令 n选项
命令解释:读取下一个输入行,这里需要用n后面的一个命令处理该行,也就是要将n与{}结合使用
[zhangyongqiao.pt@v128217:~$] cat Sed_Test
line 1: Hello!
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
[zhangyongqiao.pt@v128217:~$] sed -n '/Hello/{n;s/MR/mr/;p}' Sed_Test
line 2: mr.zhang
-------------------------------------------------------------------------------------------------------
最后来一点扩展
先来看一个例子
[zhangyongqiao.pt@v128217:~$] sed -n '2p;1p;1p;2p' Sed_Test
line 1: Hello!
line 1: Hello!
line 2: MR.zhang
line 2: MR.zhang
为什么不是如下结果呢?
===========================================================
[zhangyongqiao.pt@v128217:~$] sed -n '2p;1p;1p;2p' Sed_Test
line 2: MR.zhang
line 1: Hello!
line 1: Hello!
line 2: MR.zhang
===========================================================
对于一个很简单的打印第二行操作
[zhangyongqiao.pt@v128217:~$] sed '2p' Sed_Test
line 1: Hello!
line 2: MR.zhang
line 2: MR.zhang
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
问题:为什么打印第二行的操作不在最后进行呢?【如下】
############################################################
[zhangyongqiao.pt@v128217:~$] sed '2p' Sed_Test
【line 2: MR.zhang】 #为什么不在这里?
line 1: Hello!
line 2: MR.zhang
【line 2: MR.zhang】 #为什么在这里?
line 3: welcome to hangzhou !
line 4: enjoy youself!
line 5: 11111.
line 6: Hello!Hello!
【line 2: MR.zhang】 #为什么不在这里?
#############################################################
在sed处理文件时,每行都被存入一个叫模式空间的临时缓冲区中,
最终所有被处理的行都将打印输出(除非当行被删除或者输出取消)。
接着模式空间被清空,并存入新的一行等待处理。
也就是说sed的处理方式是按行循环处理,
对于命令行
[zhangyongqiao.pt@v128217:~$] sed '2p' Sed_Test
转换成其他语言的代码大致如下:
while(file.getline()!=EOF)//如果下一行不为空,则读取下一行
{
if('n'!=Config.verbose)println(Line); //如果命令行中没有-n参数,就打印该行
if(Line_Number==2)println(Line); //执行循环体中的2p命令(打印第二行)
}
这也就很好的解释了上述输出。
这下大家都懂了吧!
文章到此已经结束,如有疑问或者小朱有写错的地方。欢迎大家留言交流哦~
咱的宗旨是快乐分享,共同进步!