sed的不同执行方式

2023-09-22 09:19:12

1. 命令行执行多条sed命令

1.1 命令行通过多条-e选项

sed -e 'command1' -e 'command2' -e 'command3' 

匹配root或nobody,或mail: 

sed -n -e '/^root/ p' -e '/^nobody/ p' -e '/^mail/p' /etc/passwd

1.2 用\换行

Shell的换行符依然有效,这有利于提高长命令的可读性。

sed -n -e '/^root/ p' \
       -e '/^nobody/ p' \
       -e '/^mail/p' /etc/passwd

1.3 用 { }组合语句块

sed -n '{
/^root/ p
/^nobody/ p
/^mail/ p 
}' /etc/passwd

2. sed脚本文件

如果需要复用一组sed命令,可以把它们写入一个脚本文件,然后用命令行参数-f调用。

数据文件data.txt内容:

101,Zhang san,Fu Jian
102,Li si,Shan Dong
103,Wang Wu,Bei Jing
104,Zhao Qian Sun,Zhe Jiang
105,Ge Lin,Shang Hai

脚本文件cmd.sed

s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
s/^.*/<&>/
s/Li/Lee/

执行命令

sed -f cmd.sed data.txt

3. 注释

sed脚本的注释行以井号#打头。为上面的脚本加上注释:

# Swap field 1 (id) with field 2 (name)
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
# Enclose the whole line within < and >
s/^.*/<&>/
# Replace Li with Lee
s/Li/Lee/

如果sed脚本 的首行的前两个字符为#n,那么sed会自动使用-n选项(不打印),这时打印需要脚本中显式调用p命令。

4. 把sed作为命令解释器

刚才演示的sed脚本执行过程,是从命令行用sed 命令加上-f参数选项调用的。那么,能否像shell脚本那样直接./执行呢?答案是肯定的。方法是在脚本的首行,调用sed作为命令解释器,换句话说,把脚本首行内容写为"#!/bin/sed -f"

#!/bin/sed -f
# Swap field 1 (id) with field 2 (name)
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
# Enclose the whole line within < and >
s/^.*/<&>/
# Replace Li with Lee
s/Li/Lee/

然后,赋予脚本可执行权限:

chmod 755 cmd.sed

接下来执行它:

./cmd.sed data.txt

效果和之前是一样的。 

5. 直接修改输入文件

sed缺省不会修改输入文件的内容。它会把修改后的内容输出到终端上。如果你需要保存修改后的内容,可以把它们重定向到另一个文件,或者用w命令写文件。如果你的目的就是修改源文件,那么,你还需要用新生成的文件覆盖源文件。

sed本身提供了一个-i选项,可以轻松的实现这个目的。在使用它之前,请先备份自己的源始数据文件。

sed -i -f cmd.sed data.txt

更多推荐

如何解决 Spring Boot Actuator 的未授权访问漏洞

SpringBootActuator的作用是提供了一组管理和监控端点,允许你查看应用程序的运行时信息,例如健康状态、应用程序信息、性能指标等。这些端点对于开发、测试和运维团队来说都非常有用,可以帮助快速诊断问题、监控应用程序的性能,并采取必要的措施来维护和管理应用程序。SpringBootActuator未授权访问的配

LeetCode 40. Combination Sum II【回溯,剪枝】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

LeetCode 39. Combination Sum【回溯,剪枝】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

Android.bp常用语法和预定义属性

介绍Android.bp是Android构建系统中用于定义模块和构建规则的配置文件,它使用一种简单的声明式语法。以下是Android.bp的一些常见语法规则和约定:注释:单行注释使用//符号。多行注释使用/和/包围。和go语言相同//这是单行注释/*这是多行注释*/模块定义:每个模块都以module_type字段开始,

hadoop集群搭建

vim/etc/hosts192.168.1.2Master.Hadoop192.168.1.3Slave1.Hadoop192.168.1.4Slave2.Hadoop192.168.1.5Slave3.Hadoop若能用主机名进行ping通,说明刚才添加的内容,在局域网内能进行DNS解析。hadoop:https:

【iOS】浅析static,const,extern关键字

文章目录前言一、staticstatic修饰局部变量static修饰全局变量总结二、const三、extern声明全局变量声明函数在头文件中使用总结前言笔者本周在学习单例模式时,用到了static关键字,特此总结博客记录学习static,const,extern关键字的过程一、staticstatic——静态,我们将用

【golang】实现通用的get/post请求(接受一个 URL 和一个结构体参数)

通用的GET请求实现一个通用的GET请求函数,该函数接受一个URL和一个结构体参数,并将结构体参数编码为查询参数。以下是一个通用的示例代码:packagemainimport("fmt""net/http""net/url""reflect""strings")funcgetFunc(baseUrlstring,str

Learn Prompt-ChatGPT 精选案例:简单介绍

恭喜你!现在你已经学会了如何编写提示语。本节主要讨论的是如何使用提示语来解决我们在日常或工作中遇到的任务。如果你已经有了一个提示语集,如何决定哪些提示语适合手头的任务?在本节中,我们将通过一些实际例子来给你提供灵感。在挑选案例的时候,我们更加希望展示的是如何将复杂的工作任务拆解成相互关联的小任务。例如在PPT制作中,我

【C++代码】平衡二叉树,二叉树的所有路径,左叶子之和--代码随想录

题目:平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。题解这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉

解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误

目录问题背景解决方案如何重置MySQLroot密码:问题背景java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLExc

CSS复习之选择器

目录一、常用选择器1.1元素选择器1.2id选择器1.3class选择器二、复合选择器2.1交集选择器2.2并集选择器三、关系选择器3.1子元素选择器3.2后代选择器3.3兄弟选择器四、属性选择器五、伪类选择器六、伪元素的选择器七、超链接的伪类一、常用选择器1.1元素选择器作用:根据标签名来选中指定的元素语法:标签名{

热文推荐