在 linux 系统中,有三个强大的文本分析处理工具:grep sed awk,其中:
grep 用于搜索文本内容 => linux grep 命令常见用法
sed 用于编辑文本内容 => linux sed 命令常见用法
awk 用于处理和生成报表 => linux awk 命令常见用法
这几个命令用来对数据流进行处理的,其工作原理都是将文件内容逐行读入,逐行处理。
sed 的全称是 “stream editor” (数据流编辑器),从这个名字也可以看出,sed 是以数据流的方式对文本内容进行编辑的,而最常见的用法就是对文本中的特定字符串进行替换或者删除,下面结合实例简单介绍 sed 命令的常见用法:
假设文件 fin.txt 中的内容如下:
hello Jobs
hello Pony
hello Jack, hi Jack
1. 把每一行中的 Jack 替换成 Mark
sed 's/Jack/Mark/' fin.txt
>> hello Jobs hello Pony hello Mark, hi Jack
sed 命令一般是写在单引号内,引号内开头的 s 表示替换(substitute),
需要注意的是,在默认情况下,sed 只会替换每行中匹配到的第一个字符串,所以上面例子中最后一行的第二个 Jack 没有被替换,如果希望替换每一行中所有匹配到的字符串,需加在命令末尾上选项 g,比如:
sed 's/Jack/Mark/g' fin.txt >> hello Jobs hello Pony hello Mark, hi Mark
注意这条命令并不会修改文件 fin.txt 的内容,只是将文件中的每一行读入缓存,执行替换,然后输出到屏幕,文件内容并没有发生改变。
如果希望直接修改文件内容,可加上选项 “ -i ”
sed -i 's/Jack/Mark/g' fin.txt
2. 将 2~3 行中的 hello 替换成 hey
sed '2,3s/hello/hey/g' fin.txt >> hello Jobs hey Pony hey Jack, hi Jack
这条命令开头的 2,3 表示仅在第 2 至第 3 行执行替换
3. 找出包含字符 Pony 的那些行,将这些行中的 hello 替换成 hey
sed '/Pony/s/hello/hey/g' fin.txt >> hello Jobs hey Pony hello Jack, hi Jack
这里的 Pony 是正则表达式,所以需要用 // 括起来
4. 删除 2~3 行
sed '2,3d' fin.txt >> hello Jobs
命令中的 d 表示删除(delete),执行之后第 2~3 行就被删除了,仅剩下第一行
5. 删除包含字符串 Pony 的行
sed '/Pony/d' fin.txt >> hello Jobs hello Jack, hi Jack
这里的 Pony 也是正则表达式,所以用 // 括起来了
6. 删除空白行
sed '/^$/d' fin.txt
这里的 ^ 匹配一行的开头, $ 匹配一行的结尾,所以 /^$/ 就表示一行的开头和结尾之间没有任何内容,也就是空白行;
注意有时候有些空白行是包含空格的,这种情况就需要写成:
sed '/^s*$/d' fin.txt
其中 s 表示空格, 星号 * 表示前面的字符重复 0 次或多次,所以这种写法可以匹配那些包含任意个空格的空白行
7. 删除不包含字符 Pony 的行
sed '/Pony/!d' fin.txt
这里的感叹号 ! 表示反选,也就是选择那些不符合正则表达式 /Pony/ 的行, 右斜杠表示转义, 因为在有些系统下 ! 会被识别成其他的意思
8. 在指定某一行的前面或者后面添加一行
sed -i '1iwelcome' fin.txt >> welcome hello Jobs hello Pony hello Jack, hi Jack
这里的 1 表示第一行, i 表示在这一行前面添加一行,如果要在第一行后面添加一行,则用字母 a :
sed -i '1awelcome' fin.txt
字母 a 是 append ,在后面添加一行
字母 i 是 insert, 在前面添加一行
9. 在匹配行的前面或者后面添加一行
sed -i '/Pony/awelcome' fin.txt >> hello Jobs hello Pony welcome hello Jack, hi Jack
同样,在后面添加一行用字母 a,在前面添加一行用字母 i
sed -i '/Pony/iwelcome' fin.txt
以上只是 sed 的常见用法,sed 的用法其实还有很多,
如果希望深入了解,建议参考相关书籍或者直接访问 GNU sed 网站:
http://www.gnu.org/software/sed/manual/sed.html
|--------------------------------------|