shell 文本处理三剑客之sed

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
/* made 2018 */

int main(){
        //print
        printf("hello world\n");/*-----*/
        return 0
/* 1 2 3 */
}
先去除单行注释 //
cat a.c | sed 's/\/\/.*//g' 
结果如下: ===========================
#include
/*
 made 2018
*/ int main(){

 printf("hello world\n");/*-----*/
 return 0
/*
1
2
3
*/ } ========================================= 再去除多行注释格式的单行格式 cat a.c | sed 's/\/\/.*//g' | sed 's/\/\*.*\*\///g'
结果如下: =========================================
#include
/*
 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

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
int main(){
 printf("hello world\n");
 return 0
} ==========================================

#sed '/^$/'d   去除空行(没有空格或tab)
#sed -r '/^[ \t]+$/'d  去除有空格或tab的空行

你可能感兴趣的:(shell)