LINUX之Sed入门【学了sed后必须知道的那些事儿】

最近由于工作需要,开始学习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视为Hello

这里的替换效果相当于

[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

转换成其他语言的代码大致如下:

whilefile.getline()=EOF//如果下一行不为空,则读取下一行

{

if('n'!=Config.verbose)println(Line); //如果命令行中没有-n参数,就打印该行

if(Line_Number==2)println(Line); //执行循环体中的2p命令(打印第二行)

}

这也就很好的解释了上述输出。

这下大家都懂了吧!



文章到此已经结束,如有疑问或者小朱有写错的地方。欢迎大家留言交流哦~

咱的宗旨是快乐分享,共同进步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值