Sed与AWK入门教程之Sed篇

2023-05-16

Sed和AWK是*nix命令行里面文本处理的神器,相当的强大.它们都是面向行的,或者说它们处理文本的方式都是一行接着一行的处理,从标准输入或者文件中读取内容,一行一行的执行脚本命令,然后打印输出到标准输出,直到文件结尾(EOF).


Sed

Sed是一个流编辑器(Stream editor),它的功能在于对于一个输入流进行编辑和处理.相当于是对一个输入流进行脚本性的编辑.其实它就是对一个输入流进行ed(一个面向行的编辑器)的脚本编辑.
Sed命令包括二部分,一部分是命令行参数或者说命令的执行方式,另一部分就是它的编辑命令,也常称作脚本.

命令执行方式:

sed [OPTIONS] -e 'scripts' | -f script-file [input-files]
如:
[alex@alexon:~]$sed -n -e 'p' speech.txt
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
看出来了吧,这相当于cat 命令.
[alex@alexon:~]$cat speech.txt 
With great power comes great responsibility.
The freedom is nothing but a chance to be better.

命令行参数

可以参考man手册.比较常用的有:

-n --quiet --silent
      不自动打印模式空间.简单来讲就是不自动打印当前要处理的行.sed会读入一行,放入到一个叫Pattern space(模式空间)里,以便于执行编辑命令来处理它.默认情况下,会自动把这一行(Pattern space里的内容)打印出来.对比下不指定这个参数时的情况就明白了:
[alex@alexon:~]$sed -e 'p' speech.txt
With great power comes great responsibility.
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
The freedom is nothing but a chance to be better.
你会看到重复,原因就是第一行是默认打印的Pattern space的内容(也就是要处理的行的内容). 然后执行编辑命令,因为编辑命令是简单的p(打印内容),所以你就看到重复的输出.
但如果加了-n(或者--quiet --silent)会变成这样:
[alex@alexon:~]$sed -n -e 'p' speech.txt
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
-e 'scripts'
    指定编辑命令,或者叫做脚本.就是一要执行的sed所支持的编辑命令.主要是模式匹配和文本替换,插入,删除之类的编辑操作.
    这个选项可以指定多个,sed会按从左到右的顺序,一个一个的执行.
[alex@alexon:~]$sed -e '=' -e 'p' -e 's/great/poor/' speech.txt
1
With great power comes great responsibility.
With poor power comes great responsibility.
2
The freedom is nothing but a chance to be better.
The freedom is nothing but a chance to be better.
解析:第一个命令'='是打印行号;第二个是打印这一行;第三个是做替换.

-f script-file
   执行指定的文件中的脚本.也就是不把编辑命令放在命令行中,而是放在一个文件里面.让sed去执行文件里面的命令.
-i[Suffix] --in-place[=Suffix]
即时的编辑输入的文件.如果指定Suffix,则会用其作后缀来备份输入文件.默认的行为是从输入文件中一行一行的读入文本,然后执行命令,然后输出结果到标准输出,也就是说对原文本没有影响,并不会改动原文件.但有些时候我们想改变原文件,也就是说要对原文件进行编辑.这时就需要用到此选项.为了不丢失数据,可以指定后缀来备份原文件.
例如:
[alex@alexon:~]$cat speech.txt 
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
[alex@alexon:~]$sed -i.bak -e 's/great/poor/g' speech.txt 
[alex@alexon:~]$cat speech.txt
With poor power comes poor responsibility.
The freedom is nothing but a chance to be better.
[alex@alexon:~]$cat speech.txt.bak 
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
命令是把文件中的great替换成poor,并把原文件备份为.bak.
到这里,是不是让你想起了强大的perl命令,也有类似的功能:
[alex@alexon:~]$perl -p -i.bak -e 's/poor/great/g' speech.txt
[alex@alexon:~]$cat speech.txt
With great power comes great responsibility.
The freedom is nothing but a chance to be better.
[alex@alexon:~]$cat speech.txt.bak 
With poor power comes poor responsibility.
The freedom is nothing but a chance to be better.


命令行参数仅是sed的一部分,它的主要核心部分是它的编辑命令,或者称作它的脚本,也就是通过-e选项指定的,或者通过-f指定的脚本文件.

编辑命令的格式:

[命令作用范围][!] cmd [cmd-args]
如,
[alex@alexon:~]$sed -n -e '1 p' speech.txt
With great power comes great responsibility.

命令的作用范围

也可以称作是寻址.通俗的讲就是指定后面的编辑命令的作用范围,通常有几种方式来指定范围:

不指定 --- 如果不指定具体的范围,那么将作用到所有的行.
[alex@alexon:~]$sed -n -e 'p' speech.txt
With great power comes great responsibility.
The freedom is nothing but a chance to be better.

用行号来指定 --- n, m第n行到第m行,特别的$代表最后一行
       1, 3    ---- 第1行到第3行
       1,$ ---- 第1 行到最后一行,也就是所有的行
相对的行数,可以在逗号后面用+m,如n,+m来表示n行以后到n+m行为止,的一个相对量,如:
[alex@alexon:~]$sed -n -e '2,+3 p' speech.txt
2. The freedom is nothing but a chance to be better.
3. The tree of liberty must be refreshed from time to time with blood of patroits
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.

跳跃性选择行.-------可以用波浪~来跳跃性选择, n~m,是指从第n行开始,后面每隔m行,执行一次,如:1~2,从第1行开始,每隔2行执行一次,也就是是执行1,3,5,7.....:
[alex@alexon:~]$sed -n -e '1~2 p' speech.txt
1. With great power comes great responsibility.
3. The tree of liberty must be refreshed from time to time with blood of patroits
5. Life is like a box of chocolates, you never know what you gonna get.

模式匹配
指定作用范围的最强大的地方就是在于可以使用模式匹配来指定.模式匹配的格式是:
[/pattern1/], [/pattern2/]
如果仅指定一个匹配,则会在所有匹配的行为执行编辑命令,如果指定二个,则是第一个匹配pattern1的行到,第一次匹配pattern2的行.
[alex@alexon:~]$sed -n -e '/great/ p' speech.txt
1. With great power comes great responsibility.
[alex@alexon:~]$sed -n -e '/great/, /chocolates/ p' speech.txt
1. With great power comes great responsibility.
2. The freedom is nothing but a chance to be better.
3. The tree of liberty must be refreshed from time to time with blood of patroits
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.

正则表达式

涉及到模式匹配就会涉及到正则表达式,sed的正则表达式与标准的略有不同.在命令行还可以指定-r --regexp-extended来使用扩展正则表达式.

位置符:

^ --- 行首
$ ----行尾
. ----任意非换行符'\n'符
\b ---- 一个单词结尾,单词定义为一连串的字母或数字,可以单独放在一端,也可放二端.

限量符

* --- 0或1个或多个
\+ --- 1个或多个
\? --- 0或1
{m} --- 出现m次
{m,n} --- 出现m次到n次,如{1,5}表示出现1次到5次不等(1,2,3,4,5次)

转义符

\ --- 可以转义特殊字符

字符集

[] ---其内的任意字符

操作符

\| ---- 或操作,abc\|123匹配123或者abc
\(...\) ----组合,形成一个组,主要用于索引
\n ---- 前面第n个组合, /\(123\)\1/ 则匹配123123

编辑命令

文本编辑命令也是非常熟悉的添加,插入,替换和删除和其他一些如打印,打印行号等.

add1[,add2] i text 插入 --- 在指定的行的前面插入文字
[alex@alexon:~]$sed -e '3 i abcd' speech.txt
1. With great power comes great responsibility.
2. The freedom is nothing but a chance to be better.
abcd
3. The tree of liberty must be refreshed from time to time with blood of patroits
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.

add1[,add2] a text 添加 --- 在指定的行的后面添加文字
[alex@alexon:~]$sed -e '3 a abcd' speech.txt
1. With great power comes great responsibility.
2. The freedom is nothing but a chance to be better.
3. The tree of liberty must be refreshed from time to time with blood of patroits
abcd
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.
add1[,add2] d删除 --- 删除指定的行
[alex@alexon:~]$sed -e '3 d' speech.txt
1. With great power comes great responsibility.
2. The freedom is nothing but a chance to be better.
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.

add1[,add2] s/pattern/replace/[opts] 替换把指定的行内的pattern替换为replace
[alex@alexon:~]$sed -e '1, 3 s/great/poor/' speech.txt
1. With poor power comes great responsibility.
2. The freedom is nothing but a chance to be better.
3. The tree of liberty must be refreshed from time to time with blood of patroits
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.
默认情况,只会替换行内第1个pattern.
            opts,可以指定选项以控制替换的行为
                n --- 替换行内第n个pattern为replace
                g --- 替换行内所有的pattern为replace
                p --- 打印这一行,如果替换成功的话.
add1[,add2] c text  把指定的行完整的替换为text
[alex@alexon:~]$sed -e '1, 3 c abcd' speech.txt
abcd
4. and tyrants.
5. Life is like a box of chocolates, you never know what you gonna get.
p   打印

=  打印行号

知道了这些就可以应付大部分的文本处理.sed也有一些高级编辑命令如操作Pattern Space,或者分支等,但比较复杂,通常也用不到.

可以看出sed是一个流编辑器,它的强大之处在于可以以行的方式来脚本化处理文本.它的主要功能就是删,查,换和添加.但它毕竟不是编程语言,所以它不能有变量,和循环,分支等逻辑.所以,sed通常与AWK一起使用.AWK更具有编程语言的特性,,它们刚好互补,一起使用构成了文本处理的二个利器.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sed与AWK入门教程之Sed篇 的相关文章

随机推荐

  • 概率论与数理统计学习笔记——参数估计

    参数估计 xff1a 估计参数 方法 xff1a 据估计法 极大似然法 矩估计法 xff1a 样本矩等于总体矩 xff08 当样本容量很大时 xff09 xff0c 总体矩就是我们所说的期望 xff0c 比如k阶总体矩就是X的k次方 xff
  • CMakeList.txt/Clion中添加头文件和库

    cmake minimum required VERSION 3 6 project capi lua include directories usr include find library LUALIB lua usr lib set
  • 人工智能基础——谓词公式化为子句集的方法

    谓词公式化为子句集 基本定义谓词公式化为子句集的步骤定理3 1 基本定义 谓词公式化为子句集的步骤 定理3 1 基本定义 原子谓词公式 xff1a 一个不能够再分解的命题 原子谓词公式及其否定统称为文字 xff0c P称为正文字 P称为负文
  • Ubuntu学习笔记——磁盘以及磁盘分区和文件系统

    磁盘 磁盘分区和文件系统 磁盘格式化磁盘设备命名使用命令行工具管理磁盘分区和文件系统 磁盘格式化 磁盘设备命名 使用命令行工具管理磁盘分区和文件系统 磁盘格式化 xff1a 低级格式化 xff1a 空白磁盘划分柱面 分区以及磁道 高级格式化
  • 几何分布的期望推导

    推导过程
  • CRC循环冗余校验纠错中循环左移的原因以及一些新感受

    CRC循环冗余校验纠错中循环左移的原因以及一些新感受 问题的描述理解已知前提左移的需求背景 xff1a 为什么需要左移 新知 问题的描述 理解 已知前提 1 我们讨论的是只有一位代码出错的情况 xff0c 多位出错的情况由于 纠错代价过大而
  • 把在forward函数里面添加的层放到GPU中

    把在forward函数里面添加的层放到GPU中 问题描述问题解决 问题描述 借鉴GoogleNet和NiN的思想 xff0c 我想在Inception最后在添加两个卷积全连接层 xff0c 但是这样子写会报错 xff0c 说是final这层
  • 自己创建XXConfig.cmake文件

    创建自定义的XXConfig cmake文件 xff1a 我们在使用cmake进行代码构建的时候 xff0c 当需要通过find package XXX 来配置相关库的路径 xff08 头文件路径 链接库路径 xff09 的时候 xff0c
  • ucosII的书籍

  • ROS中在一个功能包中导入另一个功能包的python模块

    目录 1 引言 2 创建一个功能包 3 安装功能包到ROS环境 3 1 编辑CMakeLists txt 3 2 编辑setup py 3 3 安装到ROS环境 4 模块导入 4 1 创建验证功能包 4 2 编译工作空间 4 3 运行ros
  • Android技巧:学习使用GridLayout

    GridLayout是一个非常强大的网格类布局 xff0c 它不但能像TableLayout那样 xff0c 实现网格类布局 xff0c 但它更为强大的地方在于每个Cell的大小可以横向或者纵向拉伸 xff0c 每个Cell的对齐方式也有很
  • 说说Android的MVP模式

    更多精彩博客 安卓应用开发是一个看似容易 xff0c 实则很难的一门苦活儿 上手容易 xff0c 看几天Java xff0c 看看四大组件咋用 xff0c 就能整出个不太难看的页面来 但是想要做好 xff0c 却是很难 系统框架和系统组件封
  • Lock()与RLock()锁

    资源总是有限的 xff0c 程序运行如果对同一个对象进行操作 xff0c 则有可能造成资源的争用 xff0c 甚至导致死锁 也可能导致读写混乱 锁提供如下方法 xff1a 1 Lock acquire blocking 2 Lock rel
  • 为猿七年有余,痒否?痛否?

    还未有感 xff0c 已然岁末 xff0c 犹叹时之箭逝去如斯也 xff0c 稍纵命再减一 回首望 xff0c 为猿七年有余已 xff0c 虽不成气候 xff0c 亦未全蹉跎 略做小结 xff0c 以不惘逝去之时日 xff0c 亦会大益于尔
  • Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要 xff0c 要在一个ListView中放入另一个ListView xff0c 也即在一个ListView的每个ListItem中放入另外一个ListView 但刚开始的时候 xff0c 会发现放入的小ListView会
  • Android实战技巧:ViewStub的应用

    在开发应用程序的时候 xff0c 经常会遇到这样的情况 xff0c 会在运行时动态根据条件来决定显示哪个View或某个布局 那么最通常的想法就是把可能用到的View都写在上面 xff0c 先把它们的可见性都设为View GONE xff0c
  • 深入浅出Windows BATCH

    1 什么是Windows BATCH BATCH也就是批处理文件 xff0c 有时简称为BAT xff0c 是Windows平台上的一种可执行脚本 xff0c 与 nix Linux和Unix 上的Shell脚本和其他的脚本 xff08 P
  • Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧 xff1a 多线程AsyncTask 这里就不重复 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题
  • 学习Kotlin,看这一篇就够了

    人生苦短 xff0c 要用Kotlin 这是一种对程序猿更为友好的语言 xff0c 可以减少开发者的工作量 xff0c 原本由开发者干的事情 xff0c 其实很多都可以由编译器实现了 xff0c 这是一种更为高级的语言 Java虽然严谨 x
  • Sed与AWK入门教程之Sed篇

    Sed和AWK是 nix命令行里面文本处理的神器 相当的强大 它们都是面向行的 或者说它们处理文本的方式都是一行接着一行的处理 从标准输入或者文件中读取内容 一行一行的执行脚本命令 然后打印输出到标准输出 直到文件结尾 EOF Sed Se