曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3250|回复: 1
打印 上一主题 下一主题

sed 命令中的地址概念

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-1-14 21:43:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以将一个匹配看成是一个地址,如果有两个匹配那么就有两个地址。

前向地址
一般情况下,我们只做简单的替换模式,如:
$ sed 's/linux/LINUX/g' test.txt
这种替换,会将 test.txt 文件中所有含有 linux 的行都替换成 LINUX 。但是,有时会觉得这样太广泛了,比如我们只想替换掉一些既含有 groad 又含有 linux 的行,那么我们可以使用前向地址。比如要处理下面的一个文件内容为:
[beyes@beyes   sed]$ cat test.txt
groad beyes
groad linux
beyes unix
groad windows linux
现在用 sed 的前向地址进行替换:
[beyes@beyes   sed]$ sed /groad/s/linux/LINUX/g test.txt
groad beyes
groad LINUX
beyes unix
groad windows LINUX
上面红色即是被替换的行。在 sed 命令中的替换语句并没有用 单引号括起来,实际上在一些简单的情况下这是允许的,但一个好的习惯还是用单引号将它们括起来,以免在 shell 解析时产生误解。在 sed 语句中,/groad/ 即是前向地址,它告诉 sed ,先找有 groad 字样的行,然后再找是否还含有 linux ,有则替换,否则略过。

当然,可以指定零个,一个或两个这样的地址,每个地址就是一个匹配模式,这个模式包括了行号,或者正则表达式。下面再看一下要求替换掉同时含有 groad 和 windows 以及 linux 的行中的 linux 为 LINUX 的例子。文本仍然用上面的内容,运行命令如下:
[beyes@beyes   sed]$ sed -e '/groad/!d' -e '/windows/!d' -e 's/linux/LINUX/g' test.txt
groad windows LINUX
分别用了 3 个 -e ,表示有 3 条语句,第 1 条和第 2 条表示分别找到含有 groad 和 windows 的行,它们后面的 !d 表示不删除(! 为否定之意,d 表示删除) ,之所以这么用而不是写成 -e '/groad/' 是因为这样会产生语法错误,原因是语句中缺少命令,如果非得试一下会看到错误提示:(sed: -e expression #1, char 7: missing command)。需要注意的是这 3 条语句分别用 -e 选项连在一起的。比较下面的范围删除命令的书写格式。要处理的文本如下:
[beyes@beyes   sed]$ cat temp.txt
www
baidu
com
www
groad
net
www
sina
com
cn
www
qunet
info
运行命令:
[beyes@beyes   sed]$ sed '/www/,/www/d' temp.txt
groad
net
qunet
info
[beyes@beyes   sed]$ sed '/www/,/qunet/d' temp.txt
info
上面,由逗号分隔的两个地址用来标识行的范围。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2012-1-18 18:00:07 | 只看该作者

几种常用地址格式

测试文本:
$cat temp.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.
格式一:Number (数字地址)
该格式仅匹配“第x行”输出:
# sed -n '8'p temp.txt
8. Website Design
格式二:number-1 ~ number-2
输出 number-1 以及每隔 number-2 的行:
# sed -n '3~2'p temp.txt
3. Hardware
5. Storage
7. Productivity (Too many technologies to explore, not much time available)
9. Software Development
格式三:start,end
输出 start 到 end 之间的行:
# sed -n '3,8'p temp.txt
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
格式四:'$'最后一行
# sed -n '$'p temp.txt
10.Windows- Sysadmin, reboot etc.
格式五:Number,$
打印从 Number 到最后一行:
# sed -n '3,$'p temp.txt
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 23:18 , Processed in 0.078803 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表