8.文本处理sed
一、sed流编辑器,行。
1.工作特性:sed处理文本时会每次从文本中读出来一行然后将这一行放到sed自己的工作车间内进行加工,不会动源文件只是把
这个文件每一行复制出来后放到自己专用的工作车间,这个工作车间叫做pattern space(模式空间),也就是自己的内存空间。
2.用法:sed [OPTION]... 'script' [input-file]...
3.常用选项:
-n:不输出模式空间中的内容至屏幕
-e script,--expression=script:多点编辑,就是多次编辑在一条命令中执行
-f /PATH/TO/SED_SCRIPT_FILE :每行一个编辑命令
-r,--regexp-extended:支持使用扩展正则表达式
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件
示列:删除/etc/fstab中以UUID开头的行 sed -i '/^UUID/d' /etc/fstab
4.地址定界:
空地址:对全文进行处理
单地址
#:指定行
/pattern/:被此模式所匹配到的每一行
地址范围
#,#:从第几行到第几行
#,+#:从第几行开始,增加到第几行
#,/pat1/:从所指定的行开始到匹配的某个模式行结束
/pat1/,/pat2/:从匹配的某个模式行开始,然后匹配的某个模式行结束
步进:
1~2:所有奇数行,即从第一行开始,步长为2
2~2:所有偶数行,即从第二行开始,步长为2
二、sed编辑命令
1. d 相当于delete,删除匹配模式空间中的内容
sed -i '/^UUID/d' /etc/fstab
从第1行开始,步进2个进行删除 cat -n /etc/fstab | sed '1~2d'
2. p 相当于print,打印模式匹配空间中的内容,一般和-n一起使用,先用-n不输出模式空间中的内容至屏幕,然后再打印匹配到的模式空间中的内容
打印etc/fstab文件1到5行 cat -n /etc/fstab |sed -n '1,5p'
3. a \text 相当于append,在行后面追加文本"text",支持使用\n实现多行追加
在/etc/fstab文件第三行后面追加 new line信息 cat -n /etc/fstab | sed '3a \new line'
4. i \text:相当于insert,在行前面插入文本"text",支持使用\n实现多行插入
在/etc/fstab文件第三行前面插入 new line信息 cat -n /etc/fstab|sed '3i \new line'
在所有以UUID开头的行前面插入信息: #add new device base on UUID :
cat /etc/fstab |sed '/^UUID/i \#add new device base on UUID'
5. c \text:把匹配到的行替换为此处指定的文本text
6. w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中
把非井号开头的行保存至/tmp/fstab.new文件中 sed '/^[^#]/w /tmp/fstable.new' /etc/fstab
7. r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行处
在/etc/fstab第三行的后面插入 /etc/issue文件的内容 sed '3r /etc/issue' /etc/fstab
8. = 为模式匹配到的行打印行号
9. ! 条件取反
将不以#开头的行进行删除 sed '/^#/!d' /etc/fstab
10.s/// 查找替换,其分隔符可自行指定,常用的有s@@@,s###等
g 全局替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
p 显示替换成功的行
三、经典类型练习
1.删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符
sed 's/^[[:space:]]\+//g' /etc/grub2.cfg
2.删除/etc/fstab文件中所有以#开头的行的行首的#号及#号后面的所有的空白字符
cat /etc/fstab | sed 's/^#[[:space:]]*//g'
3.输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname
echo "/var/log/messages/" |sed 's#[^/]\+/\?$##g'
四、高级编辑命令
1.工作特性
把模式空间中的内容覆盖至保持空间中。我们说过,我们sed有两个内存空间,一个叫pattern space模式空间(我们一般从文件中匹配出来的
内容就放在pattern space中的),一个叫hold space保持空间,h表示把pattern space中的内容直接复制出来覆盖至hold space中。
2.常用选项
H:把模式空间中的内容追加至保持空间中。h表示覆盖掉原来的内容;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;(会覆盖原行)
N:追加读取匹配到的行的下一行至模式空间中;(只是追加不会覆盖原行)
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
3.示例分析
显示奇数行
sed 'n;d' /etc/fstab
显示偶数行
sed -n 'n;p' /etc/fstab
逆序显示文件内容
sed '1!G;h;$!d' /etc/fstab
取出最后一行
sed '$!d' /etc/fstab
取出最后两行
sed '$!N;$!D' /etc/fstab
删除原有的所有空白行,而后为所有的非空白行添加一个空白行
sed '/^$/d;G' /etc/fstab
在原有的每行后方添加一个空白行
sed 'G' /etc/fstab

浙公网安备 33010602011771号