Sed命令学习
介绍
sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。 sed
编辑器没有破坏性,它不会修改文件,除非使用 bash 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
命令格式
sed [options] 'command' 输入文本/文件
选项
| 选项 | 说明 |
|---|---|
| -n | 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印 被 sed 特殊处理的行 |
| -e | 多重编辑,且命令顺序会影响结果 |
| -f | 指定一个 sed 脚本文件到命令行执行, |
| -r | Sed 使用扩展正则 |
| -i | 直接修改文档读取的内容,不在屏幕上输出 |
定位模式
| 类型 | 介绍 |
|---|---|
| first~step | first 指起始匹配行,step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12.......。 |
| $ | 表示匹配最后一行 |
| /REGEXP/ | 表示匹配正则那一行,通过//之间的正则来匹配,正则模式参考底下 |
| \cREGEXPc | 表示匹配正则那一行,通过\c 和 c 之间的正则来匹配,c 可以是任一字符 |
| addr1,add2 | 定址 addr1, add2 决定用于对哪些行进行编辑 |
| addr1,+N | 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行 |
正则表达式
| 元字符 | 功能 | 示例 | 示例的匹配对象 |
|---|---|---|---|
| ^ | 行首定位符 | /^love/ | 匹配所有以 love 开头的行 |
| $ | 行尾定位符 | /love$/ | 匹配所有以 love 结尾的行 |
| . | 匹配除换行外的单个字符 | /l..e/ | 匹配包含字符 l、后跟两个任意字符、再跟字母 e 的行 |
| * | 匹配零个或多个前导字符 | /*love/ | 匹配在零个或多个空格紧跟着模式 love 的行 |
| [] | 匹配指定字符组内任一字符 | /[Ll]ove/ | 匹配包含 love 和 Love 的行 |
| [^] | 匹配不在指定字符组内任一字符 | /[^A-KM-Z]ove/ | 匹配包含 ove,但 ove 之前的那个字符不在 A 至 K 或 M 至 Z 间 的行 |
| (..) | 保存已匹配的字符 | ||
| & | 保存查找串以便在替换串中引用 | s/love/**&**/ | 符号&代表查找串。字符串 love将替换前后各加了两个**的引用,即 love 变成**love** |
| < | 词首定位符 | /<love/ | 匹配包含以 love 开头的单词的行 |
| > | 词尾定位符 | /love>/ | 匹配包含以 love 结尾的单词的行 |
| x | 连续 m 个 x | /o{5}/ | 分别匹配出现连续 5 个字母 o、至少 5 个连续的 o、或 5~10 个 连续的 o 的行 |
| x | 至少 m 个 x | /o{5,}/ | |
| x | 至少 m 个 x,但不超过 n 个 x | /o{5,10}/ |
操作命令
| 命 令 | 说 明 |
|---|---|
| a|在当前行后添加一行或多行 | |
| c|用新文本修改(替换)当前行中的文本 | |
| d | 删除行 |
| i|在当前行之前插入文本 | |
| h | 把模式空间里的内容复制到暂存缓存区 |
| H | 把模式空间里的内容追加到暂存缓存区 |
| g | 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容 |
| G | 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面 |
| l | 列出非打印字符 |
| p | 打印行 |
| n | 读入下一输入行,并从下一条命令而不是第一条命令开始处理 |
| q | 结束或退出 sed |
| r | 从文件中读取输入行 |
| ! | 对所选行意外的所有行应用命令 |
| s | 用一个字符串替换另一个 |
| g | 在行内进行全局替换 |
| p | 打印行 |
| w | 将行写入文件 |
| x | 交换暂存缓冲区与模式空间的内容 |
| y | 将字符转换为另一字符(不能对正则表达式使用 y 命令) |
操作实例展示
cat << EOF > ceshi.txt
northwest NW Charles Main 3.0 .98 3 34
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
EOF
- 打印
#安静模式下打印含有`north`的行
sed -n '/north/p' ceshi.txt
- 删除
#删除第三行
sed '3d' ceshi.txt
#删除第三行到结尾
sed '3,$d' ceshi.txt
#删除所有含有north的行
sed '/north/d' ceshi.txt
- 替换
#将所有含有west的字母替换为north
sed 's/west/north/g' ceshi.txt
#替换以west开头的字母为north
sed -n 's/^west/north/p' ceshi.txt
#当“与”符号(&)用在替换串中时,它代表在查找串中匹配到的内容时。这个示例中所有以 2 位数结尾的行后面都被加上.5。
sed 's/[0-9][0-9]$/&.5/' ceshi.txt
#文件中出现的所有的 Hemenway 都被替换为 Jones,只有发生变化的行才会打印出来。选项-n 与命令 p 的组合取消了默认的输出。标志 g 的含义是表示在行内全局替换。
sed -n 's/Hemenway/Jones/gp' ceshi.txt
#紧跟在 s 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认默认为正斜杠,但可以改变。无论什么字符(换行符,反斜线除外),只要紧跟在 s 命令,就成了新的串分隔符。这个方法在查找包含正斜杠模式时很管用,例如查找路径名或生日。
sed 's#3#88#g' ceshi.txt
- 多重替换
#选项-e 用于进行多重编辑。第一重编辑编辑删除第 1~3 行。第二重编辑将Hemenway 替换为 Jones。因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。例如,如果两条命令都执行的是替换,前一次替换会影响后一次替换。
sed -e '1,3d' -e 's/Hemenway/Jones/' ceshi.txt
- 追加
#命令 a 用于之后追加。字符串 Hello, World!被加在以 north 开头的各行之后。如果要追加的内容超过一行,则除最后一行外,其他各行都必须以反斜杠结尾。
sed '/^north/a Hello world!' ceshi.txt
#命令 i 是插入命令。如果在某一行匹配到模式 eastern,i 命令就在该行的上方插入命令中插入反斜杠后面后的文本。除了最后一行,
sed '/eastern/i Hello,world!\
> -----------------------' ceshi.txt
- 修改
#c 命令是修改命令。该命令将完整地修改在模式缓冲区行的当前行。如果模式 eastern被匹配, c 命令将其后的文本替换包含 eastern 的行。
sed '/eastern/c Hello,world! \
> ------------------' ceshi.txt
- 获取下一行命令
#如果在某一行匹配到模式 eastern, n 命令就指示 sed 用下一个输入行(即包含 AM MainJr 的那行)替换模式空间中的当前行,并用 Archie 替换 AM,然后打印该行,再继续往下处理
sed '/eastern/{n;s/AM/Archie/;}' ceshi.txt
8.转换
#y 命令把 1~3 行中所有的小写命令字母都转换成了大写。正则表达式元字符对 y 命令不起作用。与替分隔符一样,斜杠可以被替换成其他字符。
sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' ceshi.txt
9.退出
#打印完第 5 行之后, q 让 sed 程序退出。
sed '5q' ceshi.txt
10.实际应用
cat > sed.txt << EOF
today is nice day
you can walk out on the street
it will be import to you
EOF
#替换签名带有空格的
sed 's/^[ ]*//' sed.txt
sed 's/^[[:space:]]*//' sed.txt
#删除文本中空行和空格组成的行及#号注释的行
grep -Ev "^#|^$|^[ ].*" /etc/ssh/ssh_config

浙公网安备 33010602011771号