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

一、多行命令

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. 在mpvue或者Vue中使用VUEX

    第一个页面Index,主页哦 import Vue from'vue' import Vuex from'vuex' import getters from'./getters' import sta ...

  2. 004-unity3d MonoBehaviour脚本方法简介

    一.MonoBehaviour 1.公共方法 CancelInvoke Cancels all Invoke calls on this MonoBehaviour. Invoke Invokes t ...

  3. spring boot gateway自定义限流

    参考:https://blog.csdn.net/ErickPang/article/details/84680132 采用自带默认网关请参照微服务架构spring cloud - gateway网关 ...

  4. 将字符串映射为Delphi控件名,批量修改控件属性

    http://blog.sina.com.cn/s/blog_4dfbd07c01000a81.html 将字符串映射为Delphi控件名,批量修改控件属性 (2007-10-08 14:50:51) ...

  5. Vue.js 注册组件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. TensorFlow学习笔记9-深度模型的优化

    深度模型的优化 回顾概念: 代价函数时训练集上损失函数的平均: \[J(\theta)=E_{(x,y)\sim \hat{p}_{data}}L(f(x;\theta),y) \tag{1}\] 引 ...

  7. boost的libboost_system问题

    最近把cpp代码从开发机放到eclipse时,遇到了不少路径问题. 安装boost的时候,其实很简单 wget http://sourceforge.net/projects/boost/files/ ...

  8. pycharm中的Terminal 中无法使用git的问题

    1.先找到git的安装路径,建议使用Everything工具 2.打开pycharm中的setting > tools > Terminal 3.把git的安装路径加上启动文件 bash. ...

  9. Spark-Core RDD的创建

    一.RDD创建的3种方式: 1.从集合中创建RDD 2.从外部存储创建RDD 3.从其他RDD转换得到新的RDD 二.从集合中创建RDD 1.使用parallelize函数创建 scala> v ...

  10. npm搭建vue全过程

    如何在Window下安装node\cnpm,并安装vue.js,创建项目 参考链接:https://blog.csdn.net/Corey_mengxiaodong/article/details/8 ...