sed 'command' filenames
Sed是非交互式的行编辑器. 它即可以从stdin中接收文本输入, 也可以从文件中接收文本输入, 它对输入中的指定行进行特定的操作, 一行操作一次, 然后将结果输出到stdout, 或输出到文件中. 在shell脚本中使用的话, sed通常都是作为管道工具链中的一个处理部分来使用.
Sed会决定它需要处理那些行, 因为sed的参数就包含有地址范围. [1] 既可以通过行号来指定地址范围, 也可以通过模式匹配来决定地址范围. 比如, 3d表示sed会删除输入的第3行, /windows/d表示sed会删除掉所有匹配"windows"的输入行.
操作符 | 名字 | 效果 |
---|---|---|
[地址范围]/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