Sed   sed学习笔记

一. Sed语法:

sed 'command' filenames

二. sed简介

Sed是非交互式的行编辑器. 它即可以从stdin中接收文本输入, 也可以从文件中接收文本输入, 它对输入中的指定行进行特定的操作, 一行操作一次, 然后将结果输出到stdout, 或输出到文件中. 在shell脚本中使用的话, sed通常都是作为管道工具链中的一个处理部分来使用.

Sed会决定它需要处理那些行, 因为sed的参数就包含有地址范围. [1] 既可以通过行号来指定地址范围, 也可以通过模式匹配来决定地址范围. 比如, 3d表示sed会删除输入的第3行, /windows/d表示sed会删除掉所有匹配"windows"的输入行.

三. 基本sed操作

操作符 名字 效果
[地址范围]/p 打印 打印[指定的地址范围]
[地址范围]/d 删除 删除[指定的地址范围]
s/pattern1/pattern2/ 替换 将指定行中, 将第一个匹配到的pattern1, 替换为pattern2.
[地址范围]/s/pattern1/pattern2/ 替换 地址范围指定的每一行中, 将第一个匹配到的pattern1, 替换为pattern2.
[地址范围]/y/pattern1/pattern2/ transform 地址范围指定的每一行中, 将pattern1中的每个匹配到pattern2的字符都使用pattern2的相应字符作替换. (等价于tr命令)
g 全局 在每个匹配的输入行中, 将每个模式匹配都作相应的操作. (译者注: 不只局限于第一个匹配)
-e   允许多项编辑
-f   指定sed脚本文件名
-n   取消缺省输出

 

除非在替换命令的后边明确指定选项g(全局), 否则的话, 替换操作只会替换掉每行上的第一个模式匹配实例.

如果在命令行或脚本中使用这个命令, sed操作可能还需要某些选项和引用.

四. 示例

$cat file1    #file1内容


northwest    NW Charles Main  3.0 .98 3 24
western      WE Sharon Gray   5.3 .97 5 23
Southwest    SW Lewis Dalsass 2.7 .8 2 18
Southern     SO Suan Chin     5.1 .95 4 15
Southeast    SE Patricia Hemenway 4.0.7 4 17
eastern      EA TB Savage         4.4 .84 5 20
northeast    NE AM Main Jr.       5.1 .94 3 13
north        NO Margot Weber      4.5 .89 5 9
central      CT Ann Stephens      5.7 .94 5 13


例1:


1. sed '1,3d' file1            #删除文件file1的1至3行

2. sed -n '/Tom/p' file1            #打印文件file1中包含Tom的行

3. sed -n '/Tom/! p' file1            #打印文件file1中不包含Tom的行

4. sed '3,$d' file1            #删除文件file1从第3行至最后一行的内容

5. sed '/Tom/d' file1            #删除文件file1中包含Tom的行

6. sed 's/Tom/Jack/g' file1            #将文件file1各行内所有的Tom都替换为Jack

7. sed -n 's/^Tom/Jack/p' file1            #将文件file1行首的Tom替换为Jack并只打印发生替换的行

8. sed -n 's/\(Mar\)got/\1ianne/p' file1            #将文件file1中的Margot替换为Marianne,并只显示发性替换的行

9. sed -n '/west/,/east/' file1            #将文件file1在west和east中的所有行打印出来

10. sed -e '1,3d' -e 's/Hemenway/Jones/' file1    #对file1先编辑,再替换

11. sed '/Susan/r file2' file1            #在文件file1中所有包含Suan的行后读入文件file2的内容

12. sed -n '/north/w file3' file1    #将file1中包含north的行写入file3

13. sed  '/^north /a --->new appended line<---' file1    #将file1中以north开头的行后添加一行内容

14. sed  '/eastern/i --->new insert line<---' file1    #将file1中包含eastern的行前插入一行内容


例2. sed脚本

$cat sed_sh1


/Lewis /a \
saaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbb

/Margot/c \
*********************\
*Margot has retired *|
*********************

1i employee database

$d


针对文件file1运行sed脚本sed_sh

$sed -f sed_sh1 file1

例3. sed脚本


$cat sed_sh2

/western/,/southeast/ {
/^ $/d
/Suan/ { h; d; }
}

s/TB \(Savage\)/Thomas \1/


练习

1. 写出下列sed命令的功能

1) sed -n '/sentimental/p' filex
2) sed '1,3d' filex > newfilex
3) sed '/[Dd]aniel/d' filex
4) sed -n '15,20p' filex
5) sed 1,10s/Montana/MT/g' filex
6) sed '/March/! d' filex
7) sed '/report/s/5/8/ ' filex
8) sed 's/....//' filex
9) sed 's/....$//' filex
10) sed '/east/,/west/s/North/South/' filex
11) sed -n '/Time off/w timefile' filex
12) sed 's/\([Oo]ccur\)ence/\1rence/' filex

2.写出一个能完成下列功能的sed脚本

    1)删除所有空行
    2)在第一行前插入标题"Personal sed file"
    3)把第5行到最后一行范围内第一个出现的单词"or"更改为"and"
    4)在文件的末尾加上"The End"
    5)将包含in,包含out之间的行写入另外一个文件:mysedout