windows ubuntu:sed,awk,grep篇:4.执行 sed

目录

23.单行内执行多个 sed 命令

24.sed 脚本文件

25.sed 注释

26.把 sed 当做命令解释器使用

27.直接修改输入文件


23.单行内执行多个 sed 命令

第一章内已经讲过,单行内执行多个 sed 命令有多种方法。
1. 使用多命令选项 –e
多命令选项-e 使用方法如下:
sed –e ‘command1’ –e ‘command2’ –e ‘command3’
/etc/passwd 文件中,搜索 rootnobody mail:
$ sed -n -e '/^root/ p' -e '/^nobody/ p' -e '/^mail/ p' /etc/passwd
2. 使用 \ 折行执行多个命令
在执行很长的命令,比如使用-e 选项执行多个 sed 命令时,可以使用\来把命令折到多行
sed –n –e ‘/^root/ p’ \
-e ‘/^nobody/ p’ \
-e ‘/^mail/ p’ \
/etc/passwd
3. 使用{ }把多个命令组合
如果要执行很多 sed 命令,可以使用{ }把他们组合起来执行,如:
sed –n ‘{
/^root/ p
/^nobody/ p
/^mail/ p
}’ /etc/passwd

24.sed 脚本文件

如果用重复使用一组 sed 命令,那么可以建立 sed 脚本文件,里面包含所有要执行的 sed
令,然后用 -f 选项来使用。
首先建立下面文件,里面包含了所有要执行的 sed 命令。前面已经解释过各个命令的含义,
现在你应该知道所有命令的意思了。
$ vi mycommands.sed
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g
s/^.*/<&>/
s/Developer/IT Manager/
s/Manager/Director/
现在执行脚本里面的命令 :
$ sed -f mycommands.sed employee.txt
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>

25.sed 注释

sed 注释以 # 开头。因为 sed 是比较晦涩难懂的语言,所以你现在写下的 sed 命令,时间一长,
再看时就不那么容易理解了。因此,建议把写脚本时的初衷作为注释,写到脚本里面。如下
所示:
$ vim mycommands.sed
#交换第一列和第二列
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g
#把整行内容放入<>
s/^.*/<&>/
#Developer 替换为 IT Manager
s/Developer/IT Manager/
#Manager 替换为 Director
s/Manager/Director/
注意: 如果 sed 脚本第一行开始的两个字符是 #n 的话, sed 会自动使用 -n 选项 ( 即不自动打
印模式空间的内容 )

26.sed 当做命令解释器使用

一如你可以把命令放进一个 shell 脚本中,然后调用脚本名称来执行它们一样,你也可以把
sed 用作命令解释器。要实现这个功能,需要在 sed 脚本最开始加入 ”#!/bin/sed –f” 如下所
:
$ vi myscript.sed
#!/bin/sed -f
#交换第一列和第二列
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g
#把整行内容放入<>s/^.*/<&>/
#Developer 替换为 IT Manager
s/Developer/IT Manager/
#Manager 替换为 Director
s/Manager/Director/
现在,给这个脚本加上可执行权限 , 然后直接在命令行调用它 :
$ chmod u+x myscript.sed
$ ./myscript.sed employee.txt
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>
也可以指定-n 选项来屏蔽默认输出:
$ vim testscript.sed
#!/bin/sed -nf
/root/ p
/nobody/ p
/mail/ p
然后加上可执行权限,执行 :
$ chmod u+x testscript.sed
$ ./testscript.sed /etc/passwd
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
处于测试目的,把 testscript.sed 里面的 -n 去掉,然后再执行一次,观察它是如何运行的。
重要提示 : 使用 -n 时,必须是 -nf. 如果你写成 -fn, 执行脚本时就会获得下面的错误 :
$ ./testscript.sed /etc/passwd
/bin/sed: couldn't open file n: No such file or directory

27.直接修改输入文件

目前为止,你知道 sed 默认不会修改输入文件,它只会把输出打印到标准输出上。当想保存
结果时,把输出重定向到文件中 ( 或使用 w 命令 )
执行下面的例子之前,先备份一下 employee.txt 文件 :
$ cp employee.txt employee.txt.orig
为了修改输入文件,通常方法是把输出重定向到一个临时文件,然后重命名该临时文件 :
sed ‘s/John/Johnny/’ employee.txt > new-employee.txt
mv new-employee.txt employee.txt
相比这种传统方法,可以在 sed 命令中使用 -i 选项,使 sed 可以直接修改输入文件 :
在原始文件 employee.txt 中,把 John 替换为 Johnny:
$ sed -i 's/John/Johnny/' employee.txt
$ cat employee.txt
101, Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
再次提醒 : -i 会修改输入文件 。或许这正是你想要的,但是务必小心。一个保护性的措施是,
-i 后面加上备份扩展,这一 sed 就会在修改原始文件之前,备份一份。
在原始文件 employee.txt 中,把 John 替换为 Johnny ,但在替换前备份 employee.txt:
$ sed -ibak 's/John/Johnny/' employee.txt
备份的文件如下 :
$ cat employee.txtbak
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
修改后的原始文件为 :
$ cat employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
除了使用 -i, 也可以使用完整样式 –in-place. 下面两个命令是等价的 :
sed –ibak ‘s/John/Johnny/’ employee.txt
sed –in-place=bak ‘s/John/Johnny/’ employee.txt
最后,为了继续下面的例子,把原来的 employee.txt 还原回去 :
cp employee.txt.orig employee.txt

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis-Plus自定义dataScpoe拦截器实现数据权限

使用AOP切面&#xff0c;自定义注解&#xff0c;自定义mybatisplus拦截器&#xff0c;使用 JSqlParser 自定拼接where条件。 1、自定义注解DataScope&#xff1b;注解一般用于Service层或者DAO层(Mapper) import java.lang.annotation.*;/*** 数据权限过滤注解**/ Target(Elem…

7-云原生监控体系-PromQL-函数功能和示例

Prometheus支持几个函数来操作数据。 文章目录 1. 函数语法解释2. count(v instant-vector)3. topk(n, v instant-vector)4. bottomk(n, v instant-vector)5. increase(v range-vector)6. rate(v range-vector)7. rate 和 increase8. irate(v range-vector)9. predict_linear(…

Dockerfile: ENTRYPOINT和CMD的区别

CMD&#xff1a;The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容器启动的时候要运行的命令。 ENTRYPOINT&#xff1a;也是指定这个容器启动的时候要运行的命令。 ———————…

docker菜鸟教程

Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何Linux机器上。以下是Docker的一些基本概念和操作指南&#xff1a; 镜像(Image)&#xff1a;Docker镜像是一个文件系统&#xff0c;它包含了应用程序及…

Golang基础1-基本类型、if、switch、string

基本类型 bool 整数&#xff1a;byte(相当于uint8), rune(相当于int32), int/uint ,int8/uint8 ,int16/uint16 ,int32/uint32 ,int64/uint64 浮点数: float32 ,float64, complex64 ,complex128 array&#xff08;值类型&#xff09;、slice、map、chan&#xff08;引用类型…

【Android】 网络技术

前言 本文用于记录Android网络技术的使用&#xff0c; 包括我们如何发起一条HTTP请求、解析XML、JOSN格式的数据以及最好用的网络库Retrofit。 使用HTTP协议访问网络 关于HTTP协议的工作原理&#xff0c;我们只需要知道客户端向服务器发起一条HTTP请求&#xff0c;服务器接收…

使用VIVE Eye and Facial Tracking SDK 1.3.6.8 开发眼动追踪功能

在虚拟现实&#xff08;VR&#xff09;环境中&#xff0c;眼动追踪技术可以显著增强用户体验和应用的交互性。HTC Vive Focus 3是一款集成了眼动追踪功能的头戴式显示设备。本文详细介绍如何使用VIVE Sense的VIVE Eye and Facial Tracking SDK 1.3.6.8 在 Unity 中实现眼动追踪…

【MySQL 数据宝典】【索引原理】- 001 索引原理分析 (AVL树、B-Tree、B+Tree)

一、索引定义 MySQL官方对索引定义&#xff1a;是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。 索引是物理数据页存储&#xff0c;在数据文件中&#xff08;InnoDB&#xff0c;ibd文件&#xff09;&#xff0c;利用数据页(page)存储。 索引可以…

Rust检查一个Vec<String>是否包含一个特定的子字符串

在Rust中&#xff0c;你可以使用contains方法来检查一个Vec<&str>是否包含特定的字符串。但是&#xff0c;如果你想检查一个Vec是否包含一个特定的子字符串&#xff0c;你需要先将子字符串转换为String。 以下是一个示例代码&#xff0c;展示了如何检查一个Vec是否包…

linux 开机自启 rc.local

rc.local 是启动加载文件 例1. compose启动Harbor 写一个开启自动启动的脚本 [rootharbor harbor]# vim startall.sh #!/bin/bash cd /root/harbor docker-compose stop && docker-compose start给脚本权限 chmod x startall.sh chmod x /etc/rc.d/rc.local #ll 查…

springcloud微服务搭建多数据源(mysql,oracle,postgres,等等)管理模块,支持通过注解方式切换不同类型的数据库

1.背景 同一套微服务管理系统&#xff0c;业务完全一样&#xff0c;但不同的客户可能要求使用自己熟悉的数据库&#xff0c;比如&#xff0c;mysql&#xff0c;oracle&#xff0c;postgres&#xff0c;还有一些国产数据库。如果能够将数据库模块独立出来&#xff0c;兼容各家的…

【数据结构】算法的效率(时间复杂度和空间复杂度)

目录 一.算法的效率 二.时间复杂度 1.概念 2.大O的渐进表示法 3.常见时间复杂度计算举例 三.空间复杂度 四.常见复杂度对比 五. 复杂度的oj练习 1.消失的数字 2.轮转数字&#xff1a; 一.算法的效率 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空…

【android 问题 之--自问自答】

同一个task 可以放不同进程的activity吗&#xff1f; 答&#xff1a;可以的。 A activity获取C activity的返回值有什么方法&#xff1f; 答&#xff1a;1.最笨的办法是使用stattactivityforresult方法启动A&#xff0c;B&#xff0c;C。在onActivityResult方法中进行 回传返…

Elasticsearch文本分析深度解析

在Elasticsearch的世界里&#xff0c;文本分析是数据索引和检索过程的核心环节&#xff0c;它决定了如何将原始文本转换为可搜索的词汇单元。这一过程不仅关乎索引的效率&#xff0c;更直接影响到搜索结果的相关性和准确性。本文将深入探讨Elasticsearch中的文本分析机制&#…

【C++初阶】string

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

【Linux】信号的产生

目录 一. 信号的概念signal() 函数 二. 信号的产生1. 键盘发送2. 系统调用kill()raise()abort() 3. 软件条件alarm() 4. 硬件异常除零错误:野指针: 三. 核心转储 一. 信号的概念 信号是消息的载体, 标志着不同的行为; 是进程间发送异步信息的一种方式, 属于软中断. 信号随时都…

智能优化算法及 MATLAB 实现(书籍推荐)

智能优化算法及 MATLAB 实现&#xff08;书籍推荐&#xff09; 介绍前言目录第1章 粒子群优化算法原理及其MATLAB实现第2章 哈里斯鹰优化算法原理及其MATLAB实现第3章 沙丘猫群优化算法原理及其MATLAB实现第4章 鲸鱼优化算法原理及其MATLAB实现第5章 大猩猩部队优化算法原理及其…

MQTT学习

MQTT作为一种消息协议&#xff0c;工作在TCP/IP的协议簇下&#xff0c;用在硬件的性能低下&#xff0c;网络较差的情况下使用。 传输消息中有三种身份参与&#xff1a;订阅者、发布者、代理&#xff08;即中间服务器&#xff09;。订阅者发送订阅的主题给中间服务器&#xff0c…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

LeetCode 刷题 -- Day 7

今日题目 题目难度备注226. 翻转二叉树 简单101. 对称二叉树简单222. 完全二叉树的节点个数 简单⭐⭐⭐110. 平衡二叉树 简单⭐⭐⭐257. 二叉树的所有路径简单代码优化能力 树篇 Ⅱ 今日题目题目&#xff1a;226. 翻转二叉树一、源代码二、代码思路 题目&#xff1a;101. 对称…