linux sed 命令常见用法

在 linux 系统中,有三个强大的文本分析处理工具:grep  sed  awk,其中:

grep   用于搜索文本中的内容

sed    用于编辑文本内容

awk   用于处理和生成报表

 

这几个命令用来对数据流进行处理的,其工作原理都是将文件内容逐行读入,逐行处理。

sed 的全称是 “stream editor” (数据流编辑器),从这个名字也可以看出,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 只会替换每行中匹配到的第一个字符串,所以上面例子中最后一行的第二个 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

此时 2~3 行就被删除了,仅剩下第一行

5. 删除包含字符串 Pony 的行

sed  '/Pony/d'  fin.txt
>>
hello Jobs
hello Jack, hi Jack

这里的 Pony 也是正则表达式,所以用 // 括起来了

6. 删除空白行

sed  '/^$/'  fin.txt

这里的 ^ 匹配一行的开头, $ 匹配一行的结尾,所以 /^$/ 就表示一行的开头和结尾之间没有任何内容,也就是空白行

注意有时候有些空白行是包含空格的,这种情况就需要写成:

sed  '/^\s*$/'  fin.txt

其中 \s 表示空格, 星号 * 表示前面的字符重复 0 次或者多次,所以这种写法可以匹配那些包含任意个空格的空白行

 

7. 删除不包含字符 Pony 的行

sed  '/Pony/\!d'  fin.txt

这里的感叹号 ! 表示反选,也就是选择那些不符合正则表达式 /Pony/ 的行, 右斜杠表示转义, 因为有些系统下 ! 会被识别成其他的意思

 

 

以上只是 sed 的常见用法,sed 的用法其实还有很多,如果希望深入了解,建议参考相关书籍或者直接访问 GNU sed 网站: http://www.gnu.org/software/sed/manual/sed.html

 

 

 

 

|--------------------------------------|

  

猜你喜欢

转载自www.cnblogs.com/xiaoxie2014/p/12911241.html