grep只能实现查找行,不能把查找的内容替换。
sed流编辑器(stream editor)的缩写。配合正则表达式使用。sed命令众所周知的一个用法是进行文本替换。
cat text.txt
#rot:x:0:0:/rot:/bin/bash
#
#operator:x:11:0:/root/:/sbin/nologin
#
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
命令格式:
#只显示要打印的行 sed -n 'n,m'p filename (过滤的功能) $表示最后一行
sed -n '1,$'p text.txt
#rot:x:0:0:/rot:/bin/bash
#
#operator:x:11:0:/root/:/sbin/nologin
#
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
#打印包含某个字符串的行 sed -n '/word/'p filename
sed -n '/root/'p text.txt
#operator:x:11:0:/root/:/sbin/nologin
#不打印包含某个字符串的行 sed -n '/word/!'p filename
#!表示对后面的命令取反
sed -n '/root/!'p text.txt
#rot:x:0:0:/rot:/bin/bash
#
#
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
#sed命令加上-e选项可以实现多个行为
sed -e '1'p -e '/111/'p -n text.txt
#rot:x:0:0:/rot:/bin/bash
#111111111111111111111111
#删除某行 sed 'n,m'd filename
sed '1,3'd text.txt
#
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
#-i 直接修改文件的内容
#删除包含某个字符串的行 sed '/word/'d filename
#移除空白行 sed '/^$/'d file
sed -i '/^$/'d text.txt
#rot:x:0:0:/rot:/bin/bash
#operator:x:11:0:/root/:/sbin/nologin
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
#替换字符或字符串 sed 'n,ms///ng' filename
#n,ms表示指定n,m行,s表示替换的动作,ng表示从每行的第几处开始替换
#& 表示之前匹配到的内容
sed 's/^.*$/123&/' text.txt
#123rot:x:0:0:/rot:/bin/bash
#123operator:x:11:0:/root/:/sbin/nologin
#123operator:x:11:0:/rooot/:/sbin/nologin
#123roooot:x:0:0:/roooot:/bin/bash
#123111111111111111111111111
#123000000000000000000000000
#-r 扩展的正则表达式
#调换两个字符串的位置
#\1 \2 \3 分别表示匹配到的第1,2,3个字符
sed -r 's/(rot)(.*)(bash)/\3\2\1/g' text.txt
#bash:x:0:0:/rot:/bin/rot
#operator:x:11:0:/root/:/sbin/nologin
#operator:x:11:0:/rooot/:/sbin/nologin
#roooot:x:0:0:/roooot:/bin/bash
#111111111111111111111111
#000000000000000000000000
cat sed_data.txt
#11 abc 111 thia 9 file contains 111 11 88 numbers 0000
#\b 表示字符串的边界
#将三位数替换为NUMBER
sed -r 's/\b[0-9]{3}\b/NUMBER/g' sed_data.txt
#11 abc NUMBER thia 9 file contains NUMBER 11 88 numbers 0000
例:去除c语言注释
a.c
#include<stdio.h>
/*
made 2018
*/
int main(){
//print
printf("hello world\n");/*-----*/
return 0
/*
1
2
3
*/
}
先去除单行注释 //
cat a.c | sed 's/\/\/.*//g'
结果如下:
===========================
#include<stdio.h>
/*
made 2018
*/
int main(){
printf("hello world\n");/*-----*/
return 0
/*
1
2
3
*/
}
=========================================
再去除多行注释格式的单行格式
cat a.c | sed 's/\/\/.*//g' | sed 's/\/\*.*\*\///g'
结果如下:
=========================================
#include<stdio.h>
/*
made 2018
*/
int main(){
printf("hello world\n");
return 0
/*
1
2
3
*/
}
=========================================
去除多行注释格式的多行格式
cat a.c | sed 's/\/\/.*//g' | sed 's/\/\*.*\*\///g' | sed '/\/\*/,/\*\//'d
结果如下:
=========================================
#include<stdio.h>
int main(){
printf("hello world\n");
return 0
}
=========================================
去除空行和有空格的行,以及有的tab行
cat a.c | sed 's/\/\/.*//g' | sed 's/\/\*.*\*\///g' | sed '/\/\*/,/\*\//'d | sed '/^$/'d | sed -r '/^[ \t]+$/'d
结果如下:
==========================================
#include<stdio.h>
int main(){
printf("hello world\n");
return 0
}
==========================================
#sed '/^$/'d 去除空行(没有空格或tab)
#sed -r '/^[ \t]+$/'d 去除有空格或tab的空行