sed

    Stream EDitor 文本流编辑器, 编辑器


sed工作方式 

wKiom1m1D9fhB8YHAABO5xoQ2AI293.png

wKiom1m1D0WT1cMGAAA4IbtEK8c252.png

wKioL1m1DyDhOOpgAAA6IpFSLLY774.png

wKiom1m1D0bz56khAAA5h7nf7gs984.png

wKioL1m1DyHjJ_PzAAA76jGBRSw451.png


sed基本使用

格式一:

sed [OPTION ...] [SCRIPT] [FILE...]

多个文件处理: 处理完一个,继续处理第二个。
sed script file1 --> sed script file2

使用方法基本同vim命令
1)vim % --> sed 不用指明
2)vim @@ ## // --> sed || ,, @@ //

wKiom1m1EIDDM-C0AABRJqCgFs8555.png


格式二:

sed  '地址定界command'  FILE ...

1)地址定界

wKiom1m1FCmwPFsfAAAS-s6glds462.png

wKiom1m1FCnDz2VcAAAQ2l7GkpQ243.png

wKioL1m1FAWDyDsJAAAcT-2ncug884.png

wKiom1m1FCqxibc4AABIcFEtJng420.png

wKioL1m1FAWhqAulAAAmkPfBdCs908.png

wKiom1m1FCrj38PWAAAnjMB3nwk769.png

wKioL1m1FAaiH3SRAAAYpujmRoU388.png



2)command

wKiom1m1GxvgsRYDAAAjC3I5CMM740.png

wKioL1m1GvewFoHNAAAiT3zBrZs856.png

wKioL1m1GvezJgVpAAA_mwnwomE635.png

wKiom1m1GxyxqhKVAAA4VZHD39Q626.png

wKiom1m1GxyjuvelAAA3uTPTbEE163.png

wKioL1m1GvjCAFupAAAlIsCagqo525.png

wKioL1m1HJLR1LowAAARKHF2MOA545.png

例如:
将文件中的内容插入至指定文件中
# sed '/^UUID/r /etc/issue' /etc/fstab
# sed '1,3r /etc/centos-release' /etc/issue

wKioL1m1GvjB647jAAAb2YTbrgY507.png

wKiom1m1HOfBr6a7AAAr0UmdVJc700.png

例如:
取一个文件的基名、目录名
基名: echo "/etc/sysconfig/useradd/" | sed 's,/$,,' | sed -r 's|(.*/)([^/]+)|\2|' 
目录名: echo "/etc/sysconfig/useradd/" | sed 's,/$,,' | sed -r 's|(.*/)([^/]+)|\2|'

wKiom1m1HR3w0pF0AAA9iq8lXsU376.png

wKioL1m1HQ3x8FguAAAJG1GB_hE836.png

例如:
# echo "how are you" | sed -r 's/(how)(.*)(you)/\3\2\1/'
# echo "how are you" | sed -r 's@(how)(.*)(you)@\3\2\1@'
# echo "how are you" | sed -r 's#(how)(.*)(you)#\3\2\1#'
# echo "how are you" | sed -r 's,(how)(.*)(you),\3\2\1,'
# echo "how are you" | sed -r 's|(how)(.*)(you)|\3\2\1|'

wKioL1m1HVKjQbayAAAOzJmq1tg687.png

例如:
[root@localhost bin]# head -n 1 < /etc/passwd | sed 's,root,ROOT,'
ROOT:x:0:0:root:/root:/bin/bash
[root@localhost bin]# head -n 1 < /etc/passwd | sed 's,root,ROOT,g'
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

wKiom1m1HXfC4D7dAAAIwzsipb4173.png

例如:
[root@localhost bin]# head -n 1 < /etc/passwd | sed 's,rOOt,ROOT,i'
ROOT:x:0:0:root:/root:/bin/bash
[root@localhost bin]# head -n 1 < /etc/passwd | sed 's,rOOt,ROOT,gi'
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

wKiom1m1HXjgf8xzAAAILz07z44835.png

例如:
[root@localhost bin]# cat < /etc/passwd | sed -n 's,rOOt,ROOT,ip'
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

wKioL1m1HVOAfcKqAAAPbfJsYGQ821.png

# sed 's,,,w /PATH/TO/SOMEFILE' FILE
# sed 's,,,' FILE > /PTH/TO/SOMEFILE


练习1:删除/boot/grub/grub.conf文本中所有以空白开头的行行首的空白字符

练习2:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

练习3:echo 一个绝对路径给sed命令:取出其基名,取出目录名


练习1:删除/boot/grub/grub.conf文本中所有以空白开头的行行首的空白字符

CentOS 6:
    # cp /boot/grub/grub.conf /tmp/grub.conf
    # sed -i 's,^[[:space:]]\+,,' /tmp/grub.conf
CentOS 7:
    # cp /etc/grub2.cfg /tmp/grub2.cfg
    # sed -i 's,^[[:space:]]\+,,' /tmp/grub2.cfg

练习2:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

# cp /etc/fstab /tmp/a.file
# sed -i -r 's|^#[[:space:]]+||' /tmp/a.file

扩展:删除以#开头,后面没有跟空白字符的行的行首的#
	# cp /etc/fstab /tmp/fstab
	# echo "#hello sed" >> /tmp/fstab
	# sed -i -r 's@^#([^[:space:]].*)@\1@' /etc/fstab


练习3:echo 一个绝对路径给sed命令:取出其基名,取出目录名

测试取出文件名中存在 useradd的绝对路径
	# locate -b useradd
		...
		/usr/share/man/zh_CN/man8/useradd.8.gz
		/usr/share/man/zh_TW/man8/useradd.8.gz
		...

取出/usr/share/man/zh_TW/man8/useradd.8.gz的基名
	# echo "/usr/share/man/zh_TW/man8/useradd.8.gz/" | sed 's,/$,,' |  sed -r 's#(.*/)([^/]+$)#\2#'

取出/usr/share/man/zh_TW/man8/useradd.8.gz的目录名
	# echo "/usr/share/man/zh_TW/man8/useradd.8.gz" | sed 's,/$,,' |  sed -r 's#(.*/)([^/]+$)#\1#'


格式三:

sed '地址定界command;地址定界command;地址定界command;...'

wKiom1m1G6GxmPDuAABrv2sac9E011.png

wKioL1m1G53w-f3NAABOi48EL_0841.png