grep 见链接:http://www.cyberciti.biz/faq/grep-regular-expressions/

sed参考文章:http://www.thegeekstuff.com


sed工作原理

This is called as one execution cycle. Cycle continues till end of file/input is reached:
1. Read a entire line from stdin/file.
2. Removes any trailing newline.
3. Places the line, in its pattern buffer.
4. Modify the pattern buffer according to the supplied commands.
5. Print the pattern buffer to stdout.


sed使用语法:

sed [-nefri] [命令]
描述:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :运行一个文件内的 sed 命令, -f filename 则可以运行 filename 内的 sed 动作;
-i :直接修改读取的文件内容,而不是输出到终端。


常用例程:

# 将 ssh_config 文件中的 "GSSAPIAuthentication" 替换为 "GSSAPIAuthentication no"
# 见正则表达式匹配规则
sed -i 's/^GSSAPIAuthentication.*/GSSAPIAuthentication no/g' /etc/ssh/ssh_config

# 将 interfaces 中的 ip 改成静态的 192.168.1.123
if grep -Fq "192.168.1.111" /etc/network/interfaces
then
    sed -i -e 's/192.168.1.111/192.168.1.123/g' /etc/network/interfaces
else
(
cat <<'EOF'

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.123
netmask 255.255.255.0
gateway 192.168.1.1

EOF
) > /etc/network/interfaces

fi

详细sed使用说明:

匹配的的格式(行号,模式字符串):

  1. ADDRESS(行号):
    n : 匹配第几行
    m,n : 从m到n行
    m~n :从m行开始,每隔n行
    '$' : 最后一行

  2. PATTERN(字符串):
    /sometext/ : 匹配有sometext字符串的行

例如:

sed -n 'ADDRESS'd filename  // 行删除,delete,不会删除文件中的内容,只是在标准输出中删除该行。除非加了 -i 选项
sed -n '/PATTERN/d' filename

sed 'ADDRESS a\
    some text'  filename    // 行追加,append,在匹配行的下一行添加"some text",注意单引号
sed '/PATTERN/ a\
    some text' filename  // e.g: sed '/123/a456' aaa.txt  在匹配的123行之后插入456(一行)

sed 'ADDRESS i\
    some text' filename    // 行插入,insert,在匹配行前插入一行
sed '/PATTERN/ i\
    some text' filename  // e.g: sed '/123/i456' aaa.txt  在匹配的123行之前插入456(一行)

sed 'ADDRESS c\
    some text' filename    // 行替换,替换匹配的行
sed 'PATTERN c\
    some text' filename  // e.g: sed '/123/c456' test.txt; 将匹配的123行替换为456(一行)

最常用的,字符串替换(非行替换,详见下文的查找和替换):
sed 's/123/456/' aaa.txt  // 将第一个匹配的123替换为456,不会修改文件,除非加上 -i 选项
sed -i 's/123/456/g' aaa.txt  // 替换文件中所有匹配的123,global,直接修改文件
sed -i 's/123/456/2' aaa.txt  // 替换第二个匹配的 123,直接修改文件


sed 正则表达式查找和替换

's' 命令应该是sed中最重要的命令,语法如下:

sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename

例子:

sed '1s/aa/bb/' text.txt        //用bb替换aa,只在aa第一次出现的地方进行替换
sed '2s/aa/bb/' text.txt    //用bb替换aa,只在aa第二次出现的地方进行替换
sed 's/aa/bb/g' text.txt    //用bb替换aa,g(global )是全局替换的意思。不加g默认也是全局替换。
sed -n 's/aa/bb/gpw result.txt' text.txt    //g全局替换,p打印,w将替换结果写到result.txt文件中

sed 's/...$//' text.txt        //正则表达式匹配:将最后位置的前三个字符替换为空,即删除每行的最后三个字符。

sed -i 's/aa/bb/gI' text.txt  // 加上 I 标识表示不区别大小写
sed -i 's_aa_bb_gI' text.txt  // 如果匹配的字符串中包含/等特殊字符,可以用其他字符替换/,例如本例的_(也可以换成其他任意字符)。

执行多条sed命令

sed -e: use multiple -e options to build up a script out of many parts。
-e option is optional for sed with single command. sed will execute the each set of command while processing input from the pattern buffer

-e script, --expression=script

    add the script to the commands to be executed

例子:

sed -e 's/foo/bar/' -e '/FOO/d'

或者,以分号隔开:

sed -i -e 's/abc/efg/g; s/xyz/ghj/g' aaa.txt

解释:先用bar替换foo,然后再删除有字符串FOO的行


基本正则表达式

. : 代表任意单个字符

示例: a.b : 表示acb/a*b/a b/a9b… 都可以但不能是accb/ab

* : 重复前边的字符无限次

示例:a* : 表示a/aa/aaa/aaaa… 可以重复a无限次

.* : 任意长度的任意字符(即上面两个的组合)

示例:a.* : 表示a/ac/acc/a,b … 可以是a后边跟任意字符

? : 重复前边的字符0次或1次

示例:a?b : 表示ab/aab 其他的都不可以

[] : 指定范围内的单个字符

示例: a[c|d]b : 表示acb/adb 其他的都不可以

^ : 行首匹配,必须出现在行首

示例:^a : 表示所有以a开头的行

$ : 行尾匹配,必须出现在行尾,注意词尾与行尾的区别

示例:a$ :表示所有以a结尾的行

[^ ] : 取反,非指定范围内的单个字符

示例:a[^d]b : 表示除了adb 其他的acb/abb/a b…都可以

^$ : 空白行

\< : 词首匹配,必须出现在词首

示例:\< a : 表示a/acv/abcc… 所有以a开头的单词

\> : 词尾匹配,必须出现在词尾,注意词尾与行尾的区别

示例:a> : 表示a/cda/cca/… 所有以a结尾的单词

\{m,n\} : 重复前边的字符至少m次,最多n次,必须加上反斜杠转义

示例:a{1,3} : 表示 a/aa/aaa 可以重复a最少1次最多3次

\{m,\} : 重复前边的字符至少m次,必须加上反斜杠转义

示例:a{2,} : 表示aa/aaa/aaaa… 可以重复a最少2次最多不限

\{0,n\} : 重复前边的字符最多n次,必须加上反斜杠转义

示例:a{0,3} : 表示 空/a/aa/aaa 可以重复a最多3次也可以不重复也就是空

\{m\} : 重复前边的字符精确匹配m次,必须加上反斜杠转义

示例:a{2} : 表示 aa 精确匹配重复a2次

\(\) : 分组字符,可用\1引用左数第一个(中包含的内容

示例: a\(abc\)\1 表示:aabcabc \1引用了()中的abc

[ :upper: ] : 单个任意大写字母,注意[]与:之间有个空格,下同

示例:a[:upper:] 表示:aA/aB/aC… a后边跟任意一个大些字母

[ :lower: ] : 单个任意小写字母

[ :space: ] : 单个空白字符

[^[ :space: ]] : 单个非空白字符

[ :digit: ] : 单个任意数字0-9

示例:a[:digit:]b 表示: a0b/a1b/a2b… a和b中间跟任意一个0-9的数字

[ :alpha: ] : 单个任意字母

[ :alnum: ] : 单个任意字母或数字

[:punct:] : 单个任意特殊符号

扩展正则表达式元字符:
扩展正则表达式简化了基本正则中的一个元字符,又增加了几个。
\{m,n\} → {m,n} : 用法与基本正则中的一样

示例:a{1,3} 表示: a/aa/aaa

\(\) → () : 用法与基本正则中的一样

示例:(abc)\1 表示:abcabc

+ : 匹配前边的字符一次或多次

示例:a+ 表示: a/aa/aaa/aaaa…

| 表示或

示例:(a|b)c 表示: ac/bc

Logo

更多推荐