[收藏学习]shell之sed_1

1.sed 的运行:

sed 从文本行或标准输入中读取数据,将之拷贝到编辑缓冲区,然后开始执行命令行或脚本的第一个命令,重复直到结束。

2.sed 的调用:

sed options script file

2-1.保存 sed 的输出,使用重定向:

$ sed 'commands' inputfile > outputfile


2-2.sed 查询文本的方式:

  1. 行号,可以是一个数字,也可以是行号范围
  2. 正则表达式

sed 定位文本的一些方式:

复制代码
x    x 为一行号
x,y 表示行号范围从 x 到 y
x,y! 查询不包含指定行号 x 和 y 的行
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 在给定行号上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
复制代码

2-3.sed 基本编辑命令

复制代码
p    打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制 ASCII 代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
复制代码

3.sed 命令举例:

测试文本:

$ cat text 
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.

 

a)使用 p 打印:

复制代码
sed -n '2p' text    #只(-n)打印第 2 行
sed -n '1,3p' text #只打印 1 至 3 行
sed -n '/only/p' text #匹配单词 only,并打印该行
sed -n '4,/The/p' text #在指定的第 4 行匹配单词 The,并打印该行
sed -n '/\$/p' text #匹配字符 $,前面要加反斜杠 \
sed -n '1,$p' text #打印整个文本,$ 意为最后一行
sed -n '/.*ing/p' text #匹配以 ing 结尾的任意单词
sed -n '/music/=' text #打印匹配 music 的行号,如果打印全部文本并打印匹配的行号,用 -e
sed -n -e '/music/p' -e '/music/=' text #打印匹配行及该行行号
复制代码

b)附加文本:

a\
sed "3a\test" text #在第 3 行后新增一行文本 test
sed "/The/a\test" text #在匹配 The 的行后新增一行文本 test

c)插入文本:i\,在匹配行之前增加文本。具体和 b) 类似。

d)修改文本:

c\
sed "1c\test" text #将第 1 行替换为文本 test
sed "/The/c\test" text #将匹配 The 的行替换为文本 test

e)删除文本:

sed '[address[,address]]d' file    #命令格式
sed '1,3d' text #删除 1 至 3 行
sed '/The/d' text #删除匹配 The 的行

d)替换文本:

[address[,address]]s/pattern/replacement-pattern/[g p w n]
sed 's/night/NIGHT/' text #替换 night 为 NIGHT
sed 's/\$//' text #删除 $ 符号,没有替代文本留空
sed 's/[t,T]he/Wow/w file.out' text #将匹配的 [t,T]he 替换为 Wow 并输出到文件 file.out

e)替换修改字符串:

sed -n 's/played/from Canada &/p' text    #查找 played 并在这之前增加字符串 "from Canada ",最后输入该行

f)将 sed 结果写入文件:

sed '[address[,address]] w file.out' file.in    #命令格式
sed '1,2 w file' text #将文件 text 的第 1,2 行写入文件file

g)从文件中读取文本:

sed 'address r file.in' file    #在 address 后放置文本 file.in

h)匹配后退出 sed:

sed 'address q' file



PS:

sed 元字符集:

    1. ^    锚定行的开始。/^sed/ 匹配所有以 sed 开始的行
    2. $    锚定行的结束。/sed$/ 匹配所有以 sed 结束的行
    3. .    匹配一个非换行字符。/s.d/ 匹配 s 后接一个字符,然后是 d
    4. *    匹配零或多个字符。
    5. []    匹配一个指定范围的字符。/[sS]ed/ 匹配 所有 sed 或 Sed
    6. [^]    匹配一个不在指定范围的字符。/[^A-RT-Z]ed/ 匹配不包含 A-R T-Z 的一个字母的开头
    7. &    保存搜索字符用来替换其他字符。s/sed/**&**/,匹配的 sed 变成 **sed**
    8. \(..\)    保存匹配的字符。s/\(sed\)er/\1ers,匹配的 seder 变成 seders
    9. \<    锚定单词的开始。/\<sed/ 匹配所有以 sed 开头的单词的行
    10. \>    锚定单词的结束。/sed\>/ 匹配所有以 sed 结束的单词的行
    11. c\{m\}    字符 c 重复 m 次。/g\{5\}/ 匹配包含 5 个 g 的行
    12. c\{m,\}    字符 c 至少重复 m 次。
    13. c\{m,n\}    字符 c 至少重复 m 次,至多重复 n 次。

参见:http://www.cnblogs.com/geb515/archive/2012/03/31/2427578.html

posted @ 2012-06-11 15:33  念槐聚  阅读(162)  评论(0编辑  收藏  举报