下面这些命令未必经常会用到,但当需要时,知道这些肯定是件好事。

一、多行命令

sed命令通常是对一行数据进行处理,然后下一行重复处理。

sed编辑器包含了三个可用来处理多行文本的特殊命令

  • N:将数据流中的下一行加进来创建一个多行组来处理
  • D:删除多行组中的一行
  • P:打印多行组中的一行

1.1 next命令

两种删除匹配的下一行的办法:

cat data1.txt
This is the header line. This is a data line. This is the last line. sed '/^$/d' data1.txt
This is the header line.
This is a data line.
This is the last line. sed '/header/{n ; d}' data1.txt
This is the header line.
This is a data line. This is the last line.

空行处理

1.2 合并文本行

用大写N,可以一次性读取两行。区别与n是移动到下一行。

$ sed '/first/{ N ; s/\n/ / }' data2.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line. $ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line. $ cat data3.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance. $ sed 'N ; s/System.Administrator/Desktop User/' data3.txt
On Tuesday, the Linux Desktop User's group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.

N使用例子

在N后面最好匹配多行命令,而单行命令则可以放在N前面,如:

$ sed 'N
> s/System\nAdministrator/Desktop\nUser/
> s/System Administrator/Desktop User/
> ' data4.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All System Administrators should attend. $ cat data4.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend. $ sed '
> s/System Administrator/Desktop User/
> N
> s/System\nAdministrator/Desktop\nUser/
> ' data4.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All Desktop Users should attend.

前后写的例子

1.3 删除多行命令

如果在N后面用d,就会把多行都一起删除。但是如果用D,就会删除到\n为止。

$ sed 'N ; /System\nAdministrator/d' data4.txt
All System Administrators should attend.
$ cat data4.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
$ sed 'N ; /System\nAdministrator/D' data4.txt
Administrator's group meeting will be held.
All System Administrators should attend.

d和D的对比

然后有删除header前的空白行

$ sed '/^$/{N ; /header/D}' data5.txt
This is the header line.
This is a date line. This is the last line. $ sed '{N ; /header/D}' data5.txt
This is a date line. This is the last line.
$ sed '{N ; /header/d}' data5.txt
This is a date line. This is the last line.
$ cat data5.txt This is the header line.
This is a date line. This is the last line.

删除header前的空行

类似的和D相似的,P也是会和N配合输出第一行

$ cat data3.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
$ sed -n 'N ; /System\nAdministrator/P' data3.txt
On Tuesday, the Linux System

P的使用

二、保持空间

sed编辑器有一块称作保持空间的缓冲区域。在处理某些行时,可以用保持空间来临时保存一些行。

  • h:将模式空间那关键复制到保持空间
  • H:将模式空间附加到保持空间
  • g:将保持空间复制到模式空间
  • G:将保持空间附加到模式空间
  • x:交换模式空间和保持空间的内容
$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed -n '/first/ {h ; p; n ; p ; g ; p }' data2.txt
This is the first data line.
This is the second data line.
This is the first data line. $ sed -n '/first/ {h ; n ; p ; g ; p }' data2.txt
This is the second data line.
This is the first data line.

保持空间

三、排除命令

感叹号命令(!)用来排除命令

$ sed -n '/header/!p' data2.txt
This is the first data line.
This is the second data line.
This is the last line.
$ sed 'N;
> s/System\nAdministrator/Desktop\nUser/
> s/System Administrator/Desktop User/
> ' data4.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All System Administrators should attend.
$ sed '$!N;
> s/System\nAdministrator/Desktop\nUser/
> s/System Administrator/Desktop User/
> ' data4.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All Desktop Users should attend.

!例子

然后是将文件反转的例子:

$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed -n '{1!G ; h ; $p }' data2.txt
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.

反转例子

四、改变流

4.1 分支指令

基于地址、地址模式或地址区间排除一整块命令,这允许你只对数据流中的特定行执行一组命令。

分支命令b格式:[address]b [label]

address参数:决定了那些行的数据会触发分支明林。

label参数:定义了要跳转到的位置。

$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line. $ sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' data2.txt
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?

命令b使用例子

上面的例子里,分支跳过了2,3两行。如果不想直接跳转到脚本结尾,可为分支命令定义一个要跳转到的标签。

标签最多长7个字符,例子:

chen@ubuntu:~/shell/ch21$ sed '{/first/b jump1 ; s/This is the/No jump on/
> :jump1
> s/This is the/Jump here on/}' data2.txt
No jump on header line.
Jump here on first data line.
No jump on second data line.
No jump on last line. chen@ubuntu:~/shell/ch21$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.

命令b跳转例子

如果文中出现first,程序就跳转到jump1脚本行。如果没有匹配,sed则会继续执行脚本中的命令,包括分支标签后的命令。

chen@ubuntu:~/shell/ch21$ echo "This, is, a, test, to, remove, commas." | sed -n '{
> :start
> s/,//1p
> b start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
^C

命令b用作循环

要能停止循环,只要加上模式匹配在命令b前面就好了

chen@ubuntu:~/shell/ch21$ echo "This, is, a, test, to, remove, commas." | sed -n '{
> :start
> s/,//1p
> /,/b start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.

改进例子

4.2 测试指令

类似于分支命令,测试test命令(t)也可以用来改变sed编辑器脚本执行流程。

如果天幻命令成功匹配并替换了一个模式,测试命令就会跳转到指定标签。如果替换命令未能匹配指定模式,测试命令就不会跳转。

测试命令格式与分支命令格式相同:[address]t [label]

和分支命令一样,如果没有标签的情况下,如果测试成功,sed会跳转到脚本结尾。

测试命令基本上就是一个if-then

chen@ubuntu:~/shell/ch21$ sed '{
> s/first/matched/
> t
> s/This is the/No match on/
> }' data2.txt
No match on header line.
This is the matched data line.
No match on second data line.
No match on last line.
chen@ubuntu:~/shell/ch21$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.

测试命令例子

测试命令的循环方法:

chen@ubuntu:~/shell/ch21$ echo "This, is, a, test, to, remove, commas." | sed -n '{
> :start
> s/,//1p
> t start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.

测试命令循环方法

五、模式替代

在使用通配符时,很难知道到底哪些文本会匹配模式。

chen@ubuntu:~/shell/ch21$ echo "The cat sleeps in his hat." | sed 's/cat/"cat"/'The "cat" sleeps in his hat.

chen@ubuntu:~/shell/ch21$ echo "The cat sleeps in his hat." | sed 's/.at/".at"/g'
The ".at" sleeps in his ".at".

通配符无法再引号中使用

5.1 &符号

用&符号可以用来代表替换命令中的匹配的模式。不管匹配出来什么样的文本,都可以使用&符号,来使用这段文本。

myfly2@ubuntu:~/shell/ch21$ echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
The "cat" sleeps in his "hat".

&符号例子

5.2 替代单独的单词

有时候我们不需要整个字符串,只想提取字符串的一部分。

sed编辑器用圆括号来定义替换模式中的子模式,然后用特殊字符来引用每个子模式。

chen@ubuntu:~/shell/ch21$ echo "The System Administrator manual" | sed '
> s/\(System\) Administrator/\ User/'
The System User manual chen@ubuntu:~/shell/ch21$ echo "The System Administrator manual" | sed '
s/System \(Administrator\)/\ User/'
The Administrator User manual chen@ubuntu:~/shell/ch21$ echo "That furry cat is pretty" | sed 's/furry \(.at\)/\1/'
That cat is pretty
chen@ubuntu:~/shell/ch21$ echo "That furry hat is pretty" | sed 's/furry \(.at\)/\1/'
That hat is pretty
#当需要在两个或多个子模式间插入文本时,这个特性尤其有用
chen@ubuntu:~/shell/ch21$ echo "" | sed '{
> :start
> s/\(.*[-]\)\([-]\{\}\)/\,\/
> t start
> }'
,,
#分成两部分:
#.*[-]
#[-]{}
#第一个子模式是以数字结尾的任意长度的字符。
#第二个子模式是若干组三位数字

子模式例子

六、在脚本中使用sed

使用包装脚本,sed脚本过程繁琐,如果脚本很长的话。可以将sed编辑器命令放到shell包装脚本中。

这样可以不用每次都键入脚本。

chen@ubuntu:~/shell/ch21$ cat reverse.sh
#!/bin/bash
# Shell wrapper for sed editor script.
# to reverse text file lines.
#
sed -n '{ 1!G ; h ; $p }' $
#
chen@ubuntu:~/shell/ch21$ chmod +x reverse.sh
chen@ubuntu:~/shell/ch21$ ls
data2.txt data4.txt reverse.sh
chen@ubuntu:~/shell/ch21$ ./reverse.sh data2.txt
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.

写成文件形式的sed

6.2 重定向sed的输出

chen@ubuntu:~/shell/ch21$ cat fact.sh
#!/bin/bash
# Add commas to number in factorial answer
#
factorial=
counter=
number=$
#
while [ $counter -le $number ]
do
factorial=$[ $factorial * $counter ]
counter=$[ $counter + ]
done
#
result=$(echo $factorial | sed '{
:start
s/\(.*[-]\)\([-]\{\}\)/\,\/
t start
}')
#
echo "The result is $result"
#
chen@ubuntu:~/shell/ch21$ ./fact.sh
The result is ,,,,,,

可以发sed结果保存

七、创建sed实用工具

7.1 加倍行间距

chen@ubuntu:~/shell/ch21$ sed 'G' data2.txt
This is the header line. This is the first data line. This is the second data line. This is the last line. chen@ubuntu:~/shell/ch21$ sed '$!G' data2.txt
This is the header line. This is the first data line. This is the second data line. This is the last line.

加倍行间距

7.2 对可能还有空白行的文件加倍行间距

#先删除原来空行,然后再加空行
chen@ubuntu:~/shell/ch21$ sed '/^$/d;$!G' data6.txt
This is line one. This is line two. This is line three. This is line four.
chen@ubuntu:~/shell/ch21$

加倍行间距例子

7.3 给文件中的行编行

chen@ubuntu:~/shell/ch21$ sed '=' data2.txt

This is the header line.

This is the first data line.

This is the second data line.

This is the last line.
chen@ubuntu:~/shell/ch21$ sed '=' data2.txt | sed 'N; s/\n/ /'
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
chen@ubuntu:~/shell/ch21$ #=号命令增加行号
#N命令将两行合并成一行
#然后把换行符换成空格

增加行号的脚本

7.4 打印末尾行

chen@ubuntu:~/shell/ch21$ sed '{
:start
$q ; N ; ,$D
b start
}' data7.txt
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
chen@ubuntu:~/shell/ch21$ cat data7.txt
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .
This is line .

打印行尾

7.5 删除行

删除不需要的空白行,如果有选择的删除空白行,需要一点创造力。

7.5.1 删除连续的空白行

chen@ubuntu:~/shell/ch21$ sed '/./,/^$/!d' data8.txt
This is line one. This is line two. This is line three. This is line four.
chen@ubuntu:~/shell/ch21$ cat data8.txt
This is line one. This is line two. This is line three. This is line four.

删除连续的空白行例子

7.5.2 删除开头的空白行

chen@ubuntu:~/shell/ch21$ cat data9.txt

This is line one.

This is line two.
chen@ubuntu:~/shell/ch21$ sed '/./,$!d' data9.txt
This is line one. This is line two.

脚本例子

7.5.3 删除结尾的空白行

 chen@ubuntu:~/shell/ch21$ sed '{
> :start
> /^\n*$/{$d ; N ; b start}
> }' data10.txt
This is the first line.
This is the seconde line.
chen@ubuntu:~/shell/ch21$ cat data10.txt
This is the first line.
This is the seconde line.

例子

7.6 删除HTML标签

sed进阶的更多相关文章

  1. 第11章:sed进阶操作

    第11章:sed进阶操作 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为 ...

  2. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  3. sed进阶N;P;D

    案例 sed 的高级替换 $cat file1 why:1 why:2 3 4 5 why:6 why:7 8 why:9 $cat file2 why:1 why:2 3 4 5 why:6 why ...

  4. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...

  5. 文本处理工具——sed进阶

    一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...

  6. Shell编程—sed进阶

    1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...

  7. sed命令总结-Linux

    sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...

  8. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  9. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

随机推荐

  1. plsql汉化后,表格列注释中文显示成?号

  2. Eclipse SVN插件版本

    http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=FE8EBF532DA84BAFF9543019D01A1B15?page ...

  3. 解决gson解析long自动转为科学计数的问题

    不废话,直接上代码: public class GsonUtils { public static Gson getMapGson(){ Gson gson=new GsonBuilder().reg ...

  4. C# 捕获全局异常

    一.在Winform程序中捕获全局异常 在winfrom中我们需要了解Application对象中的两个事件 ①Application.ThreadException 事件--当UI线程中某个异常未被 ...

  5. 阅读笔记12-Java 面试题 —— 老田的蚂蚁金服面试经历

    电话一面 1.自我介绍.自己做的项目和技术领域 2.项目中的监控:那个监控指标常见的哪些? 3.微服务涉及到的技术以及需要注意的问题有哪些? 4.注册中心你了解了哪些? 5.consul 的可靠性你了 ...

  6. 详细解析arry.map() ,function.apply() 方法

    首先转载一篇博文:关于map 和callbackfn 的一些参数和返回值可以查看以下链接. http://www.cnblogs.com/xuan52rock/p/4460938.html array ...

  7. IQueryable在LINQ中

    IQueryable接口定义如下: // 摘要: // 提供对未指定数据类型的特定数据源的查询进行计算的功能. public interface IQueryable : IEnumerable { ...

  8. 手把手教你用Pytorch-Transformers——实战(二)

    本文是<手把手教你用Pytorch-Transformers>的第二篇,主要讲实战 手把手教你用Pytorch-Transformers——部分源码解读及相关说明(一) 使用 PyTorc ...

  9. linux shell 中的数组的取值 遍历 替换 删除操作

    引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...

  10. Java包的使用

    好处 1.类似于文件系统的文件夹,可以实现分类管理类文件,方便查找2.解决了同一个项目中同名类的冲突问题 包的创建 命名规范: 建议小写字母,并且采用域名倒置的写法 域名倒置:com.baidu ww ...