sed命令参数:
-e 一般含有多个命令时,才需-e选项,表示将下一参数解释为指令
$ sed -e ‘s/ MA/,Massachusetts/' -e 's/ PA,Pennsylvania/'
-n 表示阻止输入文件的输入,比如打印命令,不指定该参数,会造成匹配的打印两次,不匹配的打印一次
-f 后边跟随sed脚本
$ sed -f script.sed infile
-i 表示修改写回输入文件(不可撤回)
$ sed -i '/^$/d' test.log
注意事项:
-i选项不要与-n选项同时使用,否则会有大坑,试试就知道了....
注意单引号与双引号的区别
通过vim行编辑器运行:删除所有空行
:g/^$/d
^$表示空行(正则表达式)
关于地址的说明:
vim行编辑器需要指定行号或者全局参数g,否则只操作当前行;
sed命令不需要指定行号或者全局,每行都会执行。
$ - 表示最后一行
两个条件(逗号分隔)表示范围:
50,$ - 表示第50行至最后一行
1,/^$/ - 表示第1行至第一个空行之间的所有行(删除邮件头)
/^#if 0/,/^#endif/ - 表示#if 0 与 #endif之间的语句
地址后边跟!表示不匹配该地址的所有行(取反,排除)
/^#if 0/,/^#endif/!- 表示#if 0 与 #endif之外的所有语句
删除空白行:
空白行不是空行,空白行有制表符或者空格符,空行啥都没有。
/^[\t\ ]*$/d
以制表符或空格开头,以制表符或空格结尾(包括了空行)
删除不包括空行的空白行:
/^[\t\ ][\t\ ]*$/d
第1个[\t\ ]表示至少有一个制表符或空格
第2个[\t\ ]与*结合表示0个或者多个制表符或空格
删除包含指定字符的行
/Hello/d
删除不包含指定字符的行: 正则表达式求反,在表达试后加!
/Hello/!d
显示包含指定字符(re)的行: grep就是这么来的^~^
/re/p
字符串替换:
/World/s/World/Alex/g
vi中一般省略第二个参数:
/World/s//Alex/g
而sed中:
‘s/World/Alex/g’
最后那个g表示,如果一行中有多个,全部替换掉,否则只替换第一个匹配项
字符串替换:删除行尾空白 注意行尾标志$
/[\t\ ]*$/s///
匹配非空行:将所有非空行都加上又引号
/^[^$]/s/.*/"&"/
^[^$]表示第一个字符不是结束符,方括号里面第一个字符^表示排除的意思。
&表示本行内容,用于行前或者行尾添加内容。
匹配指定行: 将10~20行的行首添加#
10,20s/.*/#&/
删除^M:
windows文件的换行符为"\r\n"(回车换行),而unix文件的换行符为"\n"(换行),所以windos格式的文件会产生^M符号,所以只需要删除"\r"(回车)即可。
//s/\r//g
插入命令: i 在指定行插入指定内容,原来该行及以下的数据下移
在第10行插入一行内容:插入内容在第10行
'10i\hello world\'
如果指定的是范围时,原来的每一行都插入指定内容
'1,10i\hello world\'
追加命令: a 在指定行的下一行追加指定内容
在第10行后添加一行内容,添加的内容在第11行
10a\hello world\'
如果指定的是范围时,原来的每一行都插入指定内容
'1,10a\hello world\'
在最后一行添加内容:(双引号时$需要转义)
'$axxx=bbb'
修改命令: c 修改指定行的内容为指定内容(其他行不影响)
将第10行的内容,修改为指定内容,不管原来是什么
10a\hello world\'
如果指定的是范围时,指定所范围行的全部内容修改为一条语句
'1,10c\hello world\'
条件匹配时,每个匹配的行都修改
'/hello world/c\Hello World\'
转换命令: y
将小写字母转换成大写字母:
'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
sed脚本
可以将sed命令放在一个文件中,通过-f参数调用
分组命令:
地址嵌套:
删除#if 0 ~ #endif 之间的所有空行
/^#if 0/,/^#endif/{/^$/d}
多条命令:
/^#if 0/,/^#endif/{
s/cow/horse/
s/pig/cow/
}
通过脚本修改配置文件:
#!/bin/sh
ITEM=$1
VALUE=$2
# 如果值为空,则表示要注释掉该字段
if [ -z $VALUE ]; then
# 判断字符串是否存在,如果存在则注释掉
sed -i -e "/^[ \t]*$ITEM[ \t]*=/s//#&/" config.txt
else
# 先查看字段是否存在,存在则修改之,不存在则新建之
awk "/^[# \t]*$ITEM[ \t]*=/{x++} END{exit x}" config.txt
if [ $? -ne 0 ] ; then
echo "字段已存在,修改之 $ITEM=$VALUE"
sed -i -e "/^[# \t]*$ITEM[ \t]*=/c$ITEM=$VALUE" config.txt
else
echo "字段不存在,创建之 $ITEM=$VALUE"
sed -i -e "\$a$ITEM=$VALUE" config.txt
fi
fi
$ ./setval hdmi_grop 3
$ ./setval hdmi_grop