文本三剑客之sed

强大的处理文本的工具sed

我们知道,sed被称为Linux中被称为文本处理三剑客之一,相比于grep命令匹配内容的功能,sed则能够做到对匹配到的文本内容对其进行编辑。

Linux文本处理三剑客简介:

grep:文本过滤工具

sed:文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

sed用法:

sed[option]…’script’ inputfile…

其中‘script’可表示为’地址定界+编辑命令’

option:

1
2
3
4
5
-n  取消默认打印内容到屏幕
-e 多点编辑,表达且关系,与grep的-e不同,grep -e表达或关系
-f 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 原处编辑,并备份文件file.bak

地址定界:

  1. 不给地址:对全文进行处理

  2. 单地址:

    #:指定的行,$:最后一行

    /pattern/:支持正则表达式,被此模式所能匹配到的每一行

  3. 地址范围:

    #,#

    #,+#

    /pat1/,/pat2/

    /pat1/, #

  4. ~:步进

    1~2 奇数行

    2~2 偶数行

编辑命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
d       删除模式空间匹配的行
p 打印当前模式空间内容,追加到默认输出之后
a[\]text 在指定行后面追加文本
如要实现插入内容空格开头可先追加\再输入空格
支持使用\n实现多行追加
i[\]text 在指定行前面插入文本
c[\]text 替换指定行尾单行或多行文本
w /path/somefile 保存模式匹配的行到指定文件
r /path/somefile 读取指定文件的文本匹配的行后
注意:w,r后跟文件一定要加空格
可利用此命令定义别名到.bashrc
= 为模式空间中的行打印行号
! 取反,!需加载地址定界和编辑命令中间,如'2!d'
s///: 查找替换,支持使用其他分隔符;s###;s@@@

示例

以下我们创建文件test进行示例:

创建文件test

示例1:sed ‘1,10p’ /data/test.sed

sed命令默认将文本内容打印到屏幕,由于执行命令p,文本内容被打印了两遍

不加-n

sed -n ‘1,10p’ /data/test.sed

sed -n选项将取消默认输出到屏幕,仅显示p的执行结果

加-n

示例2:sed -n -e ‘1p’ -e ‘3p’

显示第一行和第三行,-e表示且的关系

-e

示例3:sed -n -f sedscripts.txt /data/test.sed

将2,5p写入sedscripts.txt文件,-f选项读取sedscripts.txt,并执行文件中内容

-f 引用文件

示例4:sed -i ‘1,10a#’ /data/test.sed

表示在第1至第10行内容后插入#,-i选项直接编辑了test.sed的文本内容

-i a

sed -i ‘/#/d’ /data/test.sed

表示将所有带#的行删掉并编辑文本

-i d

示例5:sed -n ‘3p’ 打印第3行内容

sed -n ‘2,5p’ 打印第2至第五行

sed -n ‘2,+3p’ 打印第2至第5行

sed -n ‘1~2p’ 打印奇数行

sed -n ‘2~2p’ 打印偶数行

数字定界

示例6:正则定界,表示ifconfig命令输出中开头eth2的行,至开头为lo的行

正则定界

示例7:正则数字混合定界,表示ifconfig命令输出中,eth2开头的行到第12行的内容

正则数字混合定界

示例8:多行插入,将aaa\nbbb插入到每行后面

a多行

示例9:sed ‘1,10i#’ /data/test.sed

在每一行上面插入#

i上方插入

示例10:sed ‘1,5c’ /data/test.sed

将test.sed文件中1到5行替换为一个#

c替换匹配

示例11:sed ‘2,5w f1’ /data/test.sed

将test.sed文件中第2到第5行内容打印到f1文件中

w 将匹配内容输出到指定文件

示例12:sed ‘2,5r f1’ /data/test.sed

将f1的内容插入到第2至第5行

r 跟文件写入匹配行

示例13:sed -n ‘2,5! p’ /data/test.sed

打印除了第2至第5行的内容

!除了

示例14:ifconfig |sed -n “2p”|sed -r “s@.addr:(.) Bcast.*@\1@”

利用搜索替代,我们可以将任意段字符串定义成方法,然后表示出整行,再利用后向引用即可取出该字符串。

正则取IP

-------------本文结束感谢您的阅读-------------
0%