• 如此理解sed会简单


    缘由

    以前总觉得sed的语法过于难懂,用的时间都不一定会想起来怎么用。

    每次都需要先查找帮助,然后才能应用,但随后又忘 😦

    直到今天通过man sed链接到sed官网上对sed的介绍,才明白它竟然是如此的简单明了,和逻辑自然!

    提纲挈领的sed命令语法结构

    # sed commands follow this syntax:
    
    sed [options] [addr]X[flags]
    
    
    • 1
    • 2
    • 3
    • 4

    X is a single-letter sed command.

    X 是单字符操作命令,例如s command

    [addr] is an optional line address. If [addr] is specified, the command X will be executed only on the matched lines.

    行地址可选。如果指定了,则sed仅工作做匹配的行上

    [addr] can be a single line number, a regular expression, or a range of lines (see sed addresses).

    地址信息可以是单一行号、单正则表达式,或由它们组成的地址范围

    Additional [flags] are used for some sed commands.

    附加的标志信息可以对一些sed命令进行控制

    更详细的介绍,需要看官网介绍

    语法概念介绍

    sed区别于grep搜索命令工具,sed只所以被称之为流编辑器,就在于sed除查找外的编辑动作,相对于grep还提供了流的增、删、改的功能。

    而这方面,grep命令就显得无能为力了。

    可以想象,一般我们对于文档进行编辑,遇到的首要问题是关于行的定位。

    文档编辑要针对那一行,或那一段进行处理,所以,sed工具语法开始就首先让你提供关于地址的信息,其实是非常自然的

    在语法中地址虽然可以忽略,则当地址信息省略后,实则命令是针对于全文档的处理。

    • 后续通过各种具体例子,会看到sed的命令语法结构以一贯之

    所以,sed命令是非常容易理解的 😃

    sed命令语法特殊说明

    命令部分经常使用单引号,而单引号符合bash对单引号引用内容的限定

    单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号*、美元符号$、反斜杠\等

    当然也可以用双引号,以实现变量替换

    sed选项特别介绍

    • -n

    默认情况下,将打印每一行的执行结果,以利于重定向处理结果到结果文件中。开启-n选项后,结合p命令字可以有选择地输出行

    # 不仅全部输出了,控制打印的特殊行也输出了,所以,显示了两次
    seq 5 | sed '1,2p'
    
    # 仅有第一行和第二行输出
    seq 5 | sed -n '1,2p'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • -i

    选项开启后将原地编辑输入文件,并不将结果输出到标准输出

    结束语

    正常的话,如果你了解了,前面sed命令概念介绍,以及比较熟悉sed命令,看完前面基本上可以做到心领神会了。

    后面只需要更专注编辑处理的逻辑概念,然后,再去拼凑适合的sed命令即可。

    对于附录部分,可以有选择地阅读,以增加对于sed命令的了解。

    后期会随着文档的更新,不断积累sed一些常用命令。

    附录

    sed常用命令单字母

    • s

    替换

    • d

    删除

    • a

    追加

    • i

    前插

    • p

    打印

    地址分类

    • 数字
    • 正则表达式
    • 地址范围

    特别地,在地址与命令字之间加入!,则可以实现地址反选

    具体例子介绍

    删除首行

    seq 5 | sed  '1d'
    
    • 1

    数字行号加删除命令

    删除最后一行

    seq 5 | sed  '$d'
    
    • 1

    特殊行号符号加删除命令

    组合命令

    seq 5 | sed  '1d; $d'
    
    • 1

    截取首部行

    seq 5 | sed  '2q'
    
    • 1

    地址范围反选

    seq 5 | sed  '1!d'
    
    • 1

    利用分号进行命令分割。其它-e方式不够简洁

    s命令介绍

    本身sed命令地址部分就可以有多种变化,特别地,可以与正则表达式进行结合,所以,经常看到比较复杂的sed命令都源于此种地址的的变化,以及加上s command命令本身的一些负责语法!

    s命令语法

    s/regexp/replacement/flags

    例子

    echo "hello! apple is red
    hello! banana is yellow
    hello! watermelon is green" > input.txt
    
    sed '/apple/s/hello/world/' input.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过正则表达式地址定位方式,对于含有apple的行,进行搜索hello,如果匹配则替换为world
    此例也非常典型的说明了sed语法结构是一以贯之的,s comand很好地符合了语法结构。

    利用sed语法结构,可以很清晰地解析任何sed操作!

    参考

  • 相关阅读:
    Golang Array 数组使用注意事项和细节
    【小程序】页面跳转
    当下社会和经济形势概述
    Java多线程(7):JUC(上)
    STM32中除零运算,为何程序不崩溃?
    FPGA - Verilog题目: 非整数倍数据位宽转换24to128
    【LeetCode】每日一题 2023_11_9 逃离火灾(bfs 练习)
    【CSS】Tailwind CSS
    asp.net core EF Sqlserver
    万事通,专精部分领域的多功能 Transformer 智能体
  • 原文地址:https://blog.csdn.net/jkler_doyourself/article/details/134341543