Linux命令更新-文本处理sed

简介

sed(Stream Editor)是一种功能强大的文本处理工具,用于非交互式编辑文本文件。它可以对输入流进行一系列文本处理操作,例如查找、替换、删除、添加等,是运维人员和开发人员必备的利器。相比于其他文本编辑工具,sed命令具有以下特点:

  • 流处理模式:  sed逐行处理输入流,而非整篇读取文件内容,内存占用更少,处理速度更快,尤其适用于处理大型文件。

  • 强大的模式匹配功能: sed支持基本正则表达式和扩展正则表达式,可以灵活地匹配文本内容,满足复杂的操作需求。

  • 丰富的文本处理操作: sed提供丰富的文本处理操作,包括查找、替换、删除、添加、插入、截取、变换等,可以满足各种文本处理需求。

  • 易于使用: sed命令语法简洁易懂,易于学习和使用。

命令格式

sed命令的基本格式如下:

sed [选项] [模式] [动作] 文件

其中:

  • 选项:用于指定sed命令的行为,例如是否直接修改文件内容、是否显示匹配行号等。

  • 模式:要匹配的文本模式,可以是简单的字符串、正则表达式或更复杂的条件表达式。

  • 动作:要执行的操作,例如替换文本、删除文本、添加文本等。

  • 文件:要处理的文件或包含文件列表的文件。

常用选项

sed提供了许多选项,用于控制其行为。以下是一些常用的选项:

  • -n:不显示默认输出,只显示匹配的行。

  • -i:直接修改文件内容。

  • -e:执行多个sed命令。

  • -f:从文件中读取sed命令。

  • -r:使用扩展正则表达式。

  • -l:只显示匹配的行号。

命令用法

1. 查找文本

sed '模式' 文件

例如,以下命令查找file.txt文件中包含“hello”的行:

sed 'hello' file.txt

2. 替换文本

sed 's/模式/替换/g' 文件

例如,以下命令将file.txt文件中所有出现的“old”替换为“new”:

sed 's/old/new/g' file.txt

3. 删除文本

sed 'd' 文件

例如,以下命令删除file.txt文件中所有空行:

sed 'd' file.txt

4. 添加文本

sed 'a文本' 文件

例如,以下命令在file.txt文件的第一行之前添加一行文本“Hello, world!”:

sed 'aHello, world!' file.txt

5. 直接修改文件内容

sed -i '模式 动作' 文件

例如,以下命令将file.txt文件中所有出现的“old”替换为“new”,并直接修改文件内容:

sed -i 's/old/new/g' file.txt

6. 执行多个sed命令

sed -e '模式1 动作1' -e '模式2 动作2' 文件

例如,以下命令将file.txt文件中所有出现的“old”替换为“new”,并将所有空行删除:

sed -e 's/old/new/g' -e 'd' file.txt

7. 使用扩展正则表达式

sed -r '模式' 文件

例如,以下命令查找file.txt文件中包含以“a”开头、以“z”结尾的单词的行,使用扩展正则表达式:

sed -r '[a-z]+$' file.txt

8. 使用变量

sed命令支持使用变量来简化操作。例如,以下命令将file.txt文件中所有行号替换为“Line N”,其中N是行号:

sed 'N; s/^/# Line &/g' file.txt

步骤:

  1. 定义要使用的变量。

  2. 使用变量值替换模式或动作中的一部分内容。

结果:

file.txt文件中所有行号都被替换为“Line N”。

9. 指定打印范围

sed命令支持指定打印范围,例如只打印匹配行的前N行或后N行。例如,以下命令打印file.txt文件中匹配模式“error”的行及其前后两行:

sed '/error/{n; n; p; }' file.txt

步骤:

  1. 确定要打印的范围。

  2. 使用sed命令指定打印范围。

结果:

file.txt文件中匹配模式“error”的行及其前后行都被打印出来。

10. 组合使用模式和动作

sed命令支持组合使用多个模式和动作,可以实现更复杂的操作。例如,以下命令将file.txt文件中所有以“a”开头的行替换为“new_line”,并将所有空行删除:

sed '/^a/ { s/^.*$/new_line/; } ; d' file.txt

步骤:

  1. 确定要执行的操作。

  2. 组合使用多个模式和动作实现操作。

结果:

file.txt文件中所有以“a”开头的行都被替换为“new_line”,所有空行都被删除。

命令实操

案例一:修改配置文件

假设/etc/nginx/nginx.conf文件中包含了Nginx服务器的配置信息。为了修改配置文件中的某些参数,可以以下命令:

sed 's/old_value/new_value/g' /etc/nginx/nginx.conf

例如,以下命令将/etc/nginx/nginx.conf文件中所有出现的“80”替换为“81”,修改Nginx服务器的默认端口:

sed 's/80/81/g' /etc/nginx/nginx.conf

步骤:

  1. 确定要修改的参数和修改后的值。

  2. 使用sed命令进行修改。

  3. 检查修改结果是否正确。

结果:

Nginx服务器的默认端口由80改为81。

案例二:查找并删除日志文件中的错误信息

假设/var/log/syslog文件中记录了系统的运行日志。为了查找并删除出现错误的信息,可以以下命令:

sed '/error/d' /var/log/syslog

该命令将查找/var/log/syslog文件中包含“error”的行,并将其删除。

步骤:

  1. 确定要查找的错误信息。

  2. 使用sed命令进行查找并删除。

  3. 检查删除结果是否正确。

结果:

/var/log/syslog文件中所有包含“error”的行都被删除。

案例三:批量修改文件名

假设当前目录下存在大量文件,需要将它们的文件名统一修改为特定格式。例如,将所有文件名的第一个字母改为大写。可以以下命令:

sed 's/^([^\.]*)\.\(.*\)$/\1\.\2/g' *

该命令将遍历当前目录下的所有文件,并将它们的文件名的第一个字母改为大写。

步骤:

  1. 确定要修改的文件名格式。

  2. 使用sed命令进行批量修改。

  3. 检查修改结果是否正确。

结果:

当前目录下所有文件名的第一个字母都已改为大写。

案例四:统计代码行数

假设要统计source.c文件中代码的行数,可以以下命令:

sed -n 's/^$//;p' source.c | wc -l

该命令将首先删除source.c文件中所有空行,然后使用wc -l命令统计非空行数。

步骤:

  1. 确定要统计代码行数的文件。

  2. 使用sed命令删除空行。

  3. 使用wc命令统计行数。

结果:

source.c文件中代码行的数目显示在命令行中。

案例五:从备份文件中恢复数据

假设/data/backup/data.txt是某个文件的备份文件,需要将备份文件中的数据恢复到原始文件/data/data.txt中。可以以下命令:

sed 's/^# //' /data/backup/data.txt > /data/data.txt

该命令将首先删除data/backup/data.txt文件中每一行开头的“#”符号(表示注释),然后将处理后的结果重定向到/data/data.txt文件中,覆盖原始文件中的内容。

步骤:

  1. 确定备份文件和原始文件的位置。

  2. 使用sed命令删除备份文件中的注释。

  3. 将处理后的结果覆盖原始文件。

结果:

/data/data.txt文件中的内容被恢复为备份文件中的内容。

案例六:将文本转换为表格

假设data.txt文件中的内容如下:

name,age,city
张三,30,北京
李四,25,上海
王五,40,广州

需要将该文件中的内容转换为表格形式。可以以下命令:

sed '1{s/\,/|/g;p};n{s/^/|/;s/\,/|/gp}' data.txt

该命令将首先将第一行(表头)中的逗号替换为管道符号“|”,然后将每一行的开头添加一个管道符号“|”,并将逗号替换为管道符号“|”,最后将处理后的结果输出到标准输出。

步骤:

  1. 确定要转换的文本文件。

  2. 使用sed命令将文本转换为表格格式。

  3. 将结果输出到标准输出或重定向到文件。

结果:

| name | age | city |
|---|---|---|
| 张三 | 30 | 北京 |
| 李四 | 25 | 上海 |
| 王五 | 40 | 广州 |
案例七:查找文件中的重复行

假设要查找/home/user/data目录下所有文件中重复的行。可以以下命令:

find /home/user/data -type f -exec sed 'N;!{H;d};p' {} + | sort | uniq -d

该命令首先使用find命令查找/home/user/data目录下所有文件,然后使用sed命令查找每个文件中的重复行,最后使用sort命令对结果进行排序,并使用uniq -d命令删除重复行。

步骤:

  1. 确定要查找重复行的目录。

  2. 使用find命令查找要处理的文件。

  3. 使用sed命令查找每个文件中的重复行。

  4. 使用sort命令对结果进行排序。

  5. 使用uniq命令删除重复行。

结果:

/home/user/data目录下所有文件中重复的行将被列出。

案例八:根据条件从多个文件中提取数据

假设要从/data/log/log*.txt文件中提取所有包含“error”的行,并按日期排序。可以以下命令:

sed '/error/!d' /data/log/*.txt | sort | uniq

该命令首先使用sed命令从每个文件中提取所有包含“error”的行,然后使用sort命令对结果按日期排序,最后使用uniq命令删除重复行。

步骤:

  1. 确定要提取数据的文件。

  2. 使用sed命令从每个文件中提取指定内容。

  3. 对结果进行排序或其他处理。

  4. 删除重复行。

结果:

/data/log/log*.txt文件中所有包含“error”的行将被提取出来,并按日期排序后显示。

运维实战脚本

案例一:基于条件的批量修改配置文件

场景描述:

我们需要修改/etc/apache2/apache2.conf配置文件中的多个参数,但并非所有服务器都需要修改相同的参数。例如,对于Web服务器A,需要修改“ServerName”和“DocumentRoot”参数,而对于Web服务器B,只需要修改“ServerName”参数。

解决方案:

我们可以使用sed命令结合条件判断来实现基于条件的批量修改。具体步骤如下:

  1. 准备条件判断文件: 创建一个名为“conditions.txt”的文件,其中每一行记录一个服务器的条件和需要修改的参数。例如:
ServerName=www.example.com;DocumentRoot=/var/www/html
ServerName=www.example.org
  1. 编写sed命令脚本:
#!/bin/bash# 定义条件判断文件路径
conditions_file="conditions.txt"# 逐行读取条件判断文件
while IFS=';' read -r server_name document_root; do# 判断当前服务器是否需要修改if [[ "$HOSTNAME" == "$server_name" ]]; then# 如果需要修改,则执行sed命令if [[ -n "$document_root" ]]; thensed -i "s/ServerName .*$/ServerName $server_name/g; s/DocumentRoot .*$/DocumentRoot $document_root/g" /etc/apache2/apache2.confelsesed -i "s/ServerName .*$/ServerName $server_name/g" /etc/apache2/apache2.conffifi
done < "$conditions_file"

案例二:使用变量和函数的批量文件重命名

场景描述:

我们需要将当前目录下所有符合特定规则的文件名进行重命名。例如,将所有以“image”开头的文件名改为以“new_image”开头,同时保留原始文件名的扩展名。

解决方案:

我们可以使用sed命令结合变量和函数来实现批量文件重命名。具体步骤如下:

  1. 编写sed命令脚本:
#!/bin/bash# 定义重命名规则
rename_pattern="s/^image(.*)$/new_image\1/"# 获取当前目录下的所有文件
files=$(find . -type f)# 遍历每个文件
for file in $files; do# 获取文件名和扩展名filename=$(basename "$file")name="${filename%.*}"ext="${filename##*.}"# 判断文件名是否符合重命名规则if [[ "$name" =~ ^image ]]; then# 执行sed命令重命名文件new_filename="$name.bak"sed -i "$rename_pattern" "$file"mv "$file" "$new_filename"fi
done

建议

  • 在使用sed命令之前,请务必阅读其官方手册,了解其详细用法和语法。

  • 在对重要文件进行修改之前,请务必备份原始文件。

  • 对于复杂的操作,可以先使用sed命令在测试环境中进行尝试,确保无误后再应用到生产环境。

总结

sed命令功能强大、易于使用,是运维人员和开发人员必备的文本处理工具。通过掌握sed命令的各种用法,可以高效地完成各种文本处理任务。

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

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

相关文章

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

敏捷开发适用于哪些项目?你用对了吗?

敏捷项目管理是一种适用于快速变化和不确定性高的项目环境的项目管理方法。因此&#xff0c;敏捷项目管理在软件开发、信息技术、互联网、市场营销、教育培训等领域得到了广泛的应用。 一、敏捷开发适合哪些项目&#xff1f; 1、需求频繁变化的项目 在传统的瀑布模型中&#…

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码&#xff0c;然后发送给B端&#xff0c;B端怎么解码&#xff1f; B端视频采用…

缓存技术:提升性能与效率的利器

在当今数字化时代&#xff0c;软件应用的性能与响应速度成为了衡量其成功与否的重要标准之一。随着数据量的爆炸性增长和用户需求的日益多样化&#xff0c;如何高效地处理这些数据并快速响应用户请求成为了软件开发中亟待解决的问题。缓存技术&#xff0c;作为提升系统性能、优…

【JavaScript】延迟加载 js 脚本

defer 属性&#xff1a;在 HTML 中通过设置 script 标签的 defer 属性来实现脚本的延迟加载&#xff0c;即脚本的下载与 HTML 的解析不会阻塞彼此&#xff0c;脚本会在 HTML 解析完成后才执⾏。async 属性&#xff1a;在 HTML 中通过设置 script 标签的 async 属性来实现脚本的…

【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083 [翻译] 0. 摘要 我们介绍了一种计算效率极高的CNN架构&#xff0c;称为ShuffleNet&#xff0c;该架构专为计算能力非常有限的移动设备&#xff08;例如&#xff0c;10-150 MFLOPs&#xff09;而设计。新架构利用了两个新操作&am…

Ubuntu 22.04.4 LTS (linux) Tomcat 下载 安装配置详细教程

1 官网下载 下载链接 2 ubuntu 服务器安装 #下载 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz #解压 tar zxvf apache-tomcat-9.0.91.tar.gz sudo mv apache-tomcat-9.0.91/ /data/tomcat #配置环境变量 sudo vi /etc/profil…

WebGoC题解(13) 狐猬编程:GoC L4 结业测试 第4题 找木柴

题目描述 小明今天找了n跟木柴&#xff0c;但是木柴太多了&#xff0c;小明只能拿走m根木柴&#xff0c;小明希望拿走的木柴都是剩下的木柴中最长的&#xff0c;小明还画出以下图形 例如 输入 5 3 10 20 30 40 50 小明要拿走30 40 50 这3根木柴 从大到小画出以下图形 矩形的宽…

linux cpu 占用超100% 分析。

感谢: https://www.cnblogs.com/wolfstark/p/16450131.html 总结&#xff1a; 查看进程中各个线程占用百分比 top -H -p <pid> 某线程100%了 说明 任务处理不过来 会卡 但是永远不可能超100% 系统监视器里面看到的是 所有线程占用的 总和会超100%。 所以最好的情况是&…

Android DataBinding从入门到精通

DataBinding可以更加方便的编写与视图交互的代码。即系统会为模块中的每个xml文件生成一个绑定类&#xff0c;其实例包含指向相应布局中具有ID的所有视图的直接引用。大多数情况下&#xff0c;DataBinding会代替findMyId。 启动DataBinding 在Android SDK 32及后续版本中&…

如祺出行大跌:现在谈Robotaxi概念股是不是太早了?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 有人说Robotaxi就像当年汽车换马车&#xff0c;是生产力的进步&#xff0c;是历史的更迭。 真的如此吗&#xff1f; 人们有疑问&#xff0c;市场也有疑问。 你看市面上主打Robotaxi概念的企业&#xff0c;有几家是持续向好…

MATLAB基础:字符串、元胞数组

今天我们继续学习MATLAB中的字符串、元胞和结构 字符串 由于MATLAB是面向矩阵的&#xff0c;所以字符串的处理可以用矩阵的形式实现 字符串的赋值与引用 假设变量a&#xff0c;将用单引号引起来的字符串赋值给它&#xff0c; a清心明目, b(a[4;-1;1]) 在这里&#xff0c;…

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

云计算实训11——web服务器的搭建、nfs服务器的搭建、备份静态文件、基于linux和windows实现文件共享

一、搭建web服务器 1.关闭firewall和selinux 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 停用selinux setenforce 0 配置文件中让sellinux不再启动 vim /etc/selinux/config SELINUXpermissive 2.编辑dns配置文件 vim /etc/resolv.conf nameserver 114.…

Go基础编程 - 11 - 函数(func)

接口&#xff08;interface&#xff09; 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用&#xff08;defer&#xff09;4.1 defer特…

个性化IT服务探索实践

探索和实践个性化IT服务,可以为用户提供更优质、定制化的解决方案,从而提升用户体验和满意度。以下是一些具体的步骤和建议,帮助自己在未来探索和实践个性化IT服务。 一、了解用户需求 用户调研和反馈: 进行用户调研,了解用户的需求和痛点。收集用户反馈,通过问卷、采访…

逆向破解 对汇编的 简单思考

逆向破解汇编非常之简单 只是一些反逆向技术非常让人难受 但网络里都有方法破解 申请变量 &#xff1a; int a 0; 00007FF645D617FB mov dword ptr [a],0 char b b; 00007FF645D61802 mov byte ptr [b],62h double c 0.345; 00007FF645D61…

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

微软蓝屏事件:网络安全与系统稳定性的反思与前瞻

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

探索深度学习在图像识别领域的创新应用

摘要&#xff1a; 本文深入探讨了深度学习在图像识别领域的最新进展和创新应用。通过对卷积神经网络&#xff08;CNN&#xff09;等模型的研究&#xff0c;分析了其在人脸识别、物体检测和场景理解等方面的卓越表现&#xff0c;并展望了未来深度学习技术在图像识别领域的发展趋…