曲径通幽论坛

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

使用 s 命令进行替换操作

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2012-1-20 10:11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
s 命令用来进行替换操作,替换操作是 sed 中的重要部分。语法格式如下:
sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename
其中 s 是替换命令;/ 是分割符,也可以用别的,但常用这个; REGEXP 是要替换部分,它用正则来表示,如果发生匹配则用 REPLACEMENT 来替换;FLAGS 是对替换操作的进一步说明的标志,它有以下几项:

g : 替换掉所有匹配项。

n : n 可以是任意一个数字,表示替换掉第 n 处的匹配。

p : 如果替换生效,那么打印替换后的结果。

i  : 大小写敏感的匹配。

w : 将替换结果写到一个指定文件。

测试文件内容如下:
cat tmp.txt
# Instruction Guides
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

例一:使用 ‘s//‘ 将 “Linux“ 替换为 ”Linux-Unix“
sed 's/Linux/Linux-Unix/' tmp.txt
# Instruction Guides
1. Linux-Unix Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.
由上可见,如果仅是用 s// 这样的方式,而不添加任何选项的匹配,那么替换只会发生在第一个发生匹配的地方。

例二:使用 s//g 进行全局替换
sed 's/Linux/Linux-Unix/g' tmp.txt
# Instruction Guides
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.
使用 g 选项的替换是最常用的方式之一。

例三:只替换第 2 处发生的匹配
sed 's/Linux/Linux-Unix/2' tmp.txt
# Instruction Guides
1. Linux Sysadmin, Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

例四:使用 gpw 选项将发生替换的结果输出以及写到一个文件中
$ sed -n 's/Linux/Linux-Unix/gpw result.txt' tmp.txt
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix
$ cat result.txt
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix
注意,在用 p 选项时,一般需要用 -n 来屏蔽掉其它不发生匹配的输出,单个 p 是没多大意义的。

例五:替换匹配前向 PATTERN 的行
sed '/\-/s/\-.*//g' tmp.txt
# Instruction Guides
1. Linux Sysadmin, Linux Scripting etc.
2. Databases
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows
上面,首先找出含有 '-' 符号的行,然后将它及其后的所有内容全部替换为空白。

例六:删除没一行中后面的 X 个字符
sed 's/...$//' tmp.txt
# Instruction Gui
1. Linux Sysadmin, Linux Scripting e
2. Databases - Oracle, mySQL e
3. Security (Firewall, Network, Online Security e
4. Storage in Li
5. Productivity (Too many technologies to explore, not much time availab
#  Additional F
6. Windows- Sysadmin, reboot e

例七:删除掉文本中的注释内容
sed 's/#.*//' tmp.txt

1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)

6. Windows- Sysadmin, reboot etc.

例八:删除掉注释和空行
在例七中,删除掉注释后,还流下了几个空行,但我们也经常会希望同时将这些空行去掉,那么可以:
sed -e 's/#.*//;/^$/d' tmp.txt
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
6. Windows- Sysadmin, reboot etc.
注意,上面使用了 -e 选项,这样就可以在 sed 中使用分号来分隔多个命令。

例九:删除掉 DOS (Windows) 中的新行符号(CR/LF)
$sed 's/.$//' filename

例十:删除 HTML 标志
sed -e 's/<[^>]*>//g'
上面的匹配正则中,中括号里的 ^ 表示否定的意思,而不是行首。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-11 00:29 , Processed in 0.078843 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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