Linux文本处理工具——Sed

时间:2022-11-18 14:28:51

sed:数据流编辑器; awk:报告文本的生成器

sed 基本用法:(Stream EDitor) Stream 流 EDitor 编辑器
行编辑器
全屏编辑器:vi/vim
sed:内存空间(模式空间)
默认不编辑源文件,仅对模式空间中的数据作处理,处理结束后,将模式空间打印到屏幕

sed [options] 'AddressCommannd' file ...
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改源文件
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f file: sed -f file filetest.txt 脚本文件处理源文件
-r: 表示使用扩展正则表达式
history | sed 's/^[[:space:]]*//g' | cut -d' ' -f1

Address:
1. StartLine,EndLine e.g: 1,100
2. /RegExp/ 正则表达式 e.g:/^root/
3. /Pattern1/,/Pattern2/ Pattern 模式
第一次被Pattern1匹配到的行开始,到第一次被Pattern2匹配到的行结束,这中间的所有行
4. LineNumber;指定行
$:倒数第一行
$-1:倒数第二行
5. StartLine,+N 从指定行开始向后N行

Command:
d:删除符合条件的行 e.g: sed '1,2d' /etc/fstab
sed '/oot/d' /etc/fstab
sed '1,+2d' /etc/fstab
p:显示符合条件的行 e.g: sed -n '/^\//p' /etc/fstab
a \string:在指定的行后面追加新行,内容为string e.g: sed '/^\//a \#Hello World!' /etc/fstab
i \string:在指定的行前面添加新行,内容为string e.g: sed '/^\//i \#Oh,my god!' /etc/fstab
r FILE:将指定的文件内容添加到符合条件的行处 e.g: sed '2r /etc/issue' /etc/fstab
w FILE:将地址指定的范围内的行另存至指定的文件中 e.g: sed '/oot/w /tmp/oot.txt' /etc/fstab
s/Pattern/String/:查找并替换,默认只替换每行中第
一次被匹配到的字符串加修饰符 e.g: sed 's/oot/OOT/' /etc/fstab
g:全局替换 e.g: sed 's/oot/OOT/g' /etc/fstab
i:忽略字符大小写
s///:s###:s@@@ e.g: sed 's@/@#@g' /etc/fstab
&:引用模式匹配到的整个串 e.g: sed 's#..t#&er#g' /etc/fstab
e.g: sed 's#\(.\)oo\(.\)#\1OO\2#g' /etc/fstab
练习:
1、删除/etc/grub.conf文件中行首的空白字符;
sed -r 's/^[[:space:]]*//g' /etc/grub.conf

2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字5;
sed 's/\(id:\)[0-9]\(:initdefault:\)/\15\2/g' /etc/inittab

3、删除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab

4、删除/etc/inittab文件中开头的#号;
sed 's/^#//g' /etc/inittab

5、删除某文件中开头的#号,但要求#号后面必须有空白字符;
sed -r 's/^#[[:space:]]*//g' /etc/inittab

6、删除某文件中以空白字符后跟#号开头的开头的空白字符及#号
sed -r 's/^[[:space:]]*#//g' /etc/inittab

7、取出一个文件路径的目录名称
echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@\1@g'