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<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的空行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值