sed命令解析

1、

sed执行模板=sed '模式{命令1;命令2}'

即逐行读入模式空间,执行命令,最后输出打印出来

2、

为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的内容,并追加到默认输出之前。

sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行

2-1、n命令

n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行sed。

例子:

从aaa文件中取出偶数行

1
2
3
4
5
6
7
8
9
10
cat aaa
This is 1   
This is 2   
This is 3   
This is 4   
This is 5   
   
sed -n 'n;p' aaa         //-n 表示隐藏默认输出内容   
This is 2   
This is 4


注 释:读取This is 1,执行n命令,此时模式空间为This is 2,执行p,打印模式空间内容This is 2,之后读取This is 3,执行n命令,此时模式空间为This is 4,执行p,打印模式空间内容This is 4,之后读取This is 5,执行n命令,因为没有了,所以退出,并放弃p命令。

因此,最终打印出来的就是偶数行。

2-2、N命令

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。

例子:

从aaa文件中读取奇数行

1
2
3
4
5
6
7
8
9
10
11
cat aaa  
This is 1  
This is 2  
This is 3  
This is 4  
This is 5  
                                                   
sed -n '$!N;P' aaa           
This is 1  
This is 3  
This is 5

注释中1代表This is 1   2代表This is 2  以此类推

注释:读取1,$!条件满足(不是尾行),执行N命令,得出1\n2,执行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出3\n4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5

2-3、d命令

d命令是删除当前模式空间内容(不在传至标准输出),并放弃之后的命令,并对新读取的内容,重头执行sed。

d命令例子

从aaa文件中取出奇数行

1
2
3
4
5
6
7
8
9
10
11
cat aaa  
This is 1  
This is 2  
This is 3  
This is 4  
This is 5  
                                                         
sed 'n;d' aaa          
This is 1  
This is 3  
This is 5

注释:读取1,执行n,得出2,执行d,删除2,得空,以此类推,读取3,执行n,得出4,执行d,删除4,得空,但是读取5时,因为n无法执行,所以d不执行。因无-n参数,故输出1\n3\n5

2-4、D命令

D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。

D命令例子

从aaa文件中读取最后一行

1
2
3
4
5
6
7
8
9
cat aaa  
This is 1  
This is 2  
This is 3  
This is 4  
This is 5  
                                              
sed 'N;D' aaa          
This is 5

注释:读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5

2-5、y命令

y命令的作用在于字符转换

y命令例子:

将aaa文件内容大写

1
2
3
4
5
6
sed 'y/his/HIS/' aaa 
THIS IS 1 
THIS IS 2 
THIS IS 3 
THIS IS 4 
THIS IS 5

此外,如果需要对某个字符串进行大小写转换,则可使用如下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
cat ddd  
This is a and a is 1  
This is b and b is 2  
This is c and c is 3  
This is d and d is 4  
This is e and e is 5  
  
sed 's/\b[a-z]\b/\u&/g' ddd  
This is A and A is 1  
This is B and B is 2  
This is C and C is 3  
This is D and D is 4  
This is E and E is 5

2-6、h命令,H命令,g命令,G命令

h命令是将当前模式空间中内容覆盖至保持空间,H命令是将当前模式空间中的内容追加至保持空间

g命令是将当前保持空间中内容覆盖至模式空间,G命令是将当前保持空间中的内容追加至模式空间

命令例子:

将ddd文件中数字和字母互换,并将字母大写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat ddd. sed
s/.*is \(.*\) and .*/\1/ 
y /abcde/ABCDE/
s/\(.*\)\n\(.*is \).*\(and \).*\(is \)\(.*\)/\2\5 \3\5 \4\1/ 
                                         
sed -f ddd. sed ddd 
This is 1 and 1 is A 
This is 2 and 2 is B 
This is 3 and 3 is C 
This is 4 and 4 is D 
This is 5 and 5 is E

注释:读取1,执行h,复制到保持空间,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加保持空间内容到模式空间,得

A\nThis is a and a is 1;执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。

这里需要注意的是匹配的内容中,空格一定要处理好,空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误

2-7、x命令

x命令是将当前保持空间和模式空间内容互换

 

2-8 a\ i\ c\命令

sed中,a命令是指在匹配的位置后面插入新的内容。

             i 命令是指在匹配的位置前面插入新的内容

             c命令是说将在匹配模式空间的指定行用新文本加以替代。

看例子:

  1. zoer@ubuntu:~$ cat data 
  2. naughty is a boy 
  3. cc is a girl 
  4. zoer is naughty 
  5. zoer@ubuntu:~$ cat s 
  6. /^nau/a\ 
  7. naughty\ 
  8. is\ 
  9. a\ 
  10. boy 
  11. zoer@ubuntu:~$ sed -f s data 
  12. naughty is a boy 
  13. naughty 
  14. is 
  15. boy 
  16. cc is a girl 
  17. zoer is naughty 
zoer@ubuntu:~$ cat data
naughty is a boy
cc is a girl
zoer is naughty
zoer@ubuntu:~$ cat s
/^nau/a\
naughty\
is\
a\
boy
zoer@ubuntu:~$ sed -f s data
naughty is a boy
naughty
is
a
boy
cc is a girl
zoer is naughty

上面例子是a命令的例子。在以nau开头的行下面插入一些内容。

看c命令。

  1. zoer@ubuntu:~$ cat s 
  2. /^nau/c\ 
  3. naughty\ 
  4. is\ 
  5. a\ 
  6. boy 
  7. zoer@ubuntu:~$ cat data  
  8. naughty is a boy 
  9. cc is a girl 
  10. zoer is naughty 
  11. zoer@ubuntu:~$ sed -f s data 
  12. naughty 
  13. is 
  14. boy 
  15. cc is a girl 
  16. zoer is naughty 
zoer@ubuntu:~$ cat s
/^nau/c\
naughty\
is\
a\
boy
zoer@ubuntu:~$ cat data 
naughty is a boy
cc is a girl
zoer is naughty
zoer@ubuntu:~$ sed -f s data
naughty
is
a
boy
cc is a girl
zoer is naughty

例子仅仅把a改成了c。结果就是以nau开头的行,被替换成了相应的内容。

-------------------------------------

q命令是说匹配到一定的行之后退出sed命令。

  1. zoer@ubuntu:~$ cat data 
  2. cc is a girl 
  3. zoer is naughty 
  4. naughty loves cc. 
  5. cc loves naughty 
  6. zoer@ubuntu:~$ cat s 
  7. /^nau/q 
  8. zoer@ubuntu:~$ sed -f s data 
  9. cc is a girl 
  10. zoer is naughty 
  11. naughty loves cc. 
  12. zoer@ubuntu:~$  
zoer@ubuntu:~$ cat data
cc is a girl
zoer is naughty
naughty loves cc.
cc loves naughty
zoer@ubuntu:~$ cat s
/^nau/q
zoer@ubuntu:~$ sed -f s data
cc is a girl
zoer is naughty
naughty loves cc.
zoer@ubuntu:~$ 

上面的例子,匹配到以nau开头的行,sed命令就终止了

 

 

 

2-9 r w命令

      r filename
         
          在匹配到某行后,插入filename文件的内容到该行后

    1.4.9 w filename

          将匹配到的行 写到filename文件中,filename的内容被覆盖

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux的sed命令是一个用于文本处理的强大工具。它可以根据指定的编辑命令对输入文件进行操作,并输出结果。sed命令的基本语法如下: sed [选项] sed编辑命令 输入文件 其中,选项是可选的,用于控制sed命令的行为。sed编辑命令是指对文本进行操作的具体命令,可以是单个命令,也可以是多个命令组合在一起。输入文件是要进行处理的文本文件。 sed命令还支持通过管道将shell命令的输出作为输入进行处理,具体语法如下: shell命令 | sed [选项] sed编辑命令 此外,sed命令还可以通过-f选项指定一个sed脚本文件来进行处理,具体语法如下: sed [选项] -f sed脚本文件 输入文件 在使用sed命令时,还可以通过使用一些小技巧来实现特定的功能。例如,可以使用命令连接符";"来输出多行不连续的内容。例如,以下命令会输出passwd文件中的第1行、第3行和第5行: sed -n '1p;3p;5p' passwd 这样,你就能够根据需要使用sed命令来处理文本文件,并实现各种需要的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Linux篇】sed命令详解](https://blog.csdn.net/weixin_45842494/article/details/124699219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux - sed命令详解](https://blog.csdn.net/qq_48391148/article/details/125711532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值