sed - 2 Pattern

前篇回顾
sed - 简介 读取编辑文字档的好工具

Pattern

这次聊点pattern的更多用法
最常用的用法是/pattern/command, 匹配到的该行做操作.

# 针对行的内容有root的做匹配
sed -n '/root/p' /etc/passwd

但sed有个特别的功能行定位, 就是能快速地跳到某一行开始做匹配操作,也能指定到哪行结束.
用法很简单, 透过一些简单范例, 把pattern基本所有组合都列出来.
这次为了方便看出行号, 使用nl(number lines of files) , 帮忙在每一行前面加上行数

  • 只输出某一行
# 只对第10行做输出
nl /etc/passwd | sed -n '10p' 
>     10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
  • 指定输出的开始行号到结束行号
# 从第10行开始, 到第20行, 做输出
nl /etc/passwd | sed -n '10,20p'
> 10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
# ...中间忽略
>    20	systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin

# 从第10行开始, 到最後一行, 做输出
# $表示文件最末行
nl /etc/passwd | sed -n '10,$p'
>    10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
# ...中间忽略
>    46	systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
  • 指定输出的开始行号, 和往後的要执行命令的行数;
    没法往前, 所有没有-5这样的操作
# 从第10行开始, 再往後5行, 到第16行结束并输出
sed -n '10,+5p' /etc/passwd
  • 从匹配到pattern1的行开始, 到匹配到pattern2的行做结束
    pattern需要用//包起来, 2个pattern间用,做区隔
# 从匹配到news的行开始, 直到匹配到www的行做结束
nl /etc/passwd | sed -n '/news/,/www/p'
>    10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
>    11	uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
>    12	proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
>    13	www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  • 上面的加指定行号的用法
# 从第10行开始,直到匹配到www的行做结束
# 一样是要有逗号做区隔
nl /etc/passwd | sed -n '10,/www/p' 
>    10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
>    11	uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
>    12	proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
>    13	www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# 从匹配到news开始,直到第13行做结束
nl /etc/passwd | sed -n '/news/,13p'
>    10	news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
>    11	uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
>    12	proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
>    13	www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  • 指定不输出的行号
# 不输出第一行, 本来第一行是root
nl /etc/passwd | sed -n '1!p'
>     2	daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
>     3	bin:x:2:2:bin:/bin:/usr/sbin/nologin
  • 指定不输出的行号区间
# 第2行~第5行不做输出
nl /etc/passwd | sed -n '2,5!p' 
>     1	root:x:0:0:root:/root:/bin/bash
>     6	games:x:5:60:games:/usr/games:/usr/sbin/nologin
>     7	man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  • 指定开始行号, 然後每隔几行做操作
    开始行号~步长command
# 从第1行开始, 每2行做一次匹配输出
nl /etc/passwd | sed -n '1~2p' 
>     1	root:x:0:0:root:/root:/bin/bash
>     3	bin:x:2:2:bin:/bin:/usr/sbin/nologin
>     5	sync:x:4:65534:sync:/bin:/bin/sync
  • 只输出最後一行
    $,作为行定位符号, $表示最後一行
nl /etc/passwd | sed -n '$p' 
>         46	systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin

今日小结

其实行号查找就是快速而已, 但实用性质不高
大部分用到都还是字串匹配, 或者直接指定起讫区间.
但sed就是提供不少方便的定位模式做操作.

Quesion

news假设在第5行, 但後面写结束是第1行, 这时会怎样输出?

nl /etc/passwd | sed -n '/news/,1p'
  • 全部都输出
  • 都不输出
  • 只输出第一行
  • 只输出匹配到new的行

答案是只输出匹配到new的行
因为当news被匹配到, 本来就会输出, 但之後的行, 基本上行号都大於第3行, 这条件等於白设定了.


<<:  DAY10-EXCEL统计分析:信赖区间

>>:  Day12 - 解析图片中的 QR Code 资料

[Day28] 动画篇5

帮角色在使用技能时做一个动作 从ActionBattle_Actor开始写 initialize: ...

【Day 22】卷积神经网路(Convolutional Neural Network, CNN)(下)

昨天讲完Convolution,接着今天要介绍的就是Max Pooling。 CNN - Max P...

工作散记 - Spotify for Developers

embed 连结格式: Podcast - https://open.spotify.com/em...

Day 4

在前一天,我们提到了价量是有一定的关系在。 正向成长,一般是价量齐涨,若价涨,但量没涨太多。 这时一...

DeBug Day 26

修正Bug日 [ ] 修正首页的排版问题 [ ] 修正书本细节页面的排版问题 [ ] 修正新增照片到...