未加星标

Linux-sed文本处理流编辑器

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
概述

linux sed命令是利用script来处理文本文件。

sed可依照script的指令,来处理、编辑文本文件。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

语法 sed [-hnV][-e<script>][-f<script文件>][文本文件] 参数说明: -e <script> 或 expression= <script> 以选项中指定的script来处理输入的文本文件。 -f <script文件> 或 file =<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或 help 显示帮助。 -n或 quiet或 silent 仅显示script处理后的结果。 -V或 version 显示版本信息。 动作说明: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除,所以 d 后面通常不接任何内容; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是了! 栗子 [[email protected] ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15

以下例子中的数据均已上述sedTest.txt为准

在文件的第四行后添加一行,并将结果输出到标准输出 [[email protected] ~]# sed -e 4a\Line4 sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 Line4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15

并不会修改源文件

以行为单位的新增/删除 删除第二行到第五行 [[email protected] ~]# cat -b sedTest.txt | sed '2,5d' 1 xiao gong jiang1 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 [[email protected] ~]# nl sedTest.txt |sed '2,5d' 1 xiao gong jiang1 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15

sed 的动作为 ‘2,5d’ ,那个 d 就是删除!

因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~

另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也可以!

[[email protected] ~]# nl sedTest.txt | sed -e '2,9d' 1 xiao gong jiang1 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15

同时也要注意的是, sed 后面接的动作,推荐使用 ” 两个单引号括住!

只删除某一行

比如第二行

[[email protected] ~]# nl sedTest.txt | sed '2d' 1 xiao gong jiang1 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 删除第 3 到最后一行 [[email protected] ~]# nl sedTest.txt | sed -e '3,$d' 1 xiao gong jiang1 2 xiao gong jiang2

$ 标识最后一行

在第二行后(亦即是加在第三行)增加内容 [[email protected] ~]# nl sedTest.txt | sed '2a this is added by sed' 1 xiao gong jiang1 2 xiao gong jiang2 this is added by sed 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 在第二行前(亦即是加在第二行)增加内容 [[email protected] ~]# nl sedTest.txt | sed '2i this is added by sed' 1 xiao gong jiang1 this is added by sed 2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 增加两行以上,在第二行后面加入两行字 [[email protected] ~]# nl sedTest.txt | sed '2i this is added by sed \n and I am the sencond line ' 1 xiao gong jiang1 this is added by sed and I am the sencond line 2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15

或者

[[email protected] ~]# nl sedTest.txt | sed '2a run or \ > walk ' 1 xiao gong jiang1 2 xiao gong jiang2 run or walk 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15

每一行之间都必须要以反斜杠『 \ 』来进行新行的添加。

以行为单位的替换与显示 将第2-5行的内容取代成为『a』 [[email protected] ~]# nl sedTest.txt |sed '2,5c a' 1 xiao gong jiang1 a 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 [[email protected] ~]# nl sedTest.txt |sed -e '2,5c a' 1 xiao gong jiang1 a 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15

通过这个方法可以取代整行。

仅列出文件内的第 5-7 行 [[email protected] ~]# nl sedTest.txt | sed -n '5,7p' 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7

p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

-n或 quiet或 silent 仅显示script处理后的结果。如果不加 -n ,会把所有行和匹配行都输出。

数据的搜寻并显示

搜索jiang1关键字的行

[[email protected] ~]# sed -n '/jiang1/p' sedTest.txt xiao gong jiang1 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15 关键字需要用 /关键字/

p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

如果jiang1找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。

如果不指定 -n ,如下:

[[email protected] ~]# sed '/jiang1/p' sedTest.txt xiao gong jiang1 xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang10 xiao gong jiang11 xiao gong jiang11 xiao gong jiang12 xiao gong jiang12 xiao gong jiang13 xiao gong jiang13 xiao gong jiang14 xiao gong jiang14 xiao gong jiang15 xiao gong jiang15 数据的搜寻并删除

删除所有包含jiang1的行,其他行输出

[[email protected] ~]# nl sedTest.txt|sed '/jiang1/d' 2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 数据的搜寻并执行命令

改造下数据:

将/etc/passwd root开头的打印出来 追加到 sedTest.txt文本中。

[[email protected] ~]# sed -n '/^root/p' /etc/passwd >> sedTest.txt [[email protected] ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15 root:x:0:0:root:/root:/bin/bash

把 bash 改成 xiaogongjiang

[[email protected] ~]# sed -n '/root/{s/bash/xiaogongjiang/;p}' sedTest.txt root:x:0:0:root:/root:/bin/xiaogongjiang 数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'

字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了.


Linux-sed文本处理流编辑器
栗子

获取etho0的网址信息

[[email protected] ~]# ifconfig eth0 | grep "inet addr" inet addr:10.45.7.122 Bcast:10.45.17.255 Mask:255.255.252.0

利用正则去掉ip前面的部分

[[email protected] ~]# ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' 10.45.7.122 Bcast:10.45.17.255 Mask:255.255.252.0

去掉ip后面部分

[[email protected] ~]# ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 10.45.7.122

讲解:

^ 匹配行首 例如 ^hello 会匹配以hello开头的行 . 匹配除了换行符外任意一个字符 * 前一个字符匹配0次或任意多次 $ 匹配行尾 例如 hello$ 会匹配以hello结尾的行 多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

[[email protected] ~]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g' 1 root:x:0:0:root:/root:/bin/blueshell 2 bin:x:1:1:bin:/bin:/sbin/nologin

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试!

我们还是使用我们的 sedTest.txt来测试吧

利用 sed 直接在 sedTest.txt 最后一行加入『# This is a test』 [[email protected] ~]# sed -i '$a This is for test ' sedTest.txt [[email protected] ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15 root:x:0:0:root:/root:/bin/bash This is for test

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!

每一行结尾若为 . 则换成 !

sed -i 's/\.$/\!/g' regular_express.txt

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: Linux数据删除数据流
分页:12
转载请注明
本文标题:Linux-sed文本处理流编辑器
本站链接:http://www.codesec.net/view/483245.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(51)