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