linux sed批量修改替换文件中的内容/sed特殊字符

sed系列文章

  1. linux常用命令(9):sed命令(编辑/替换/删除文本)
  2. linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行
  3. linux sed批量修改替换文件中的内容/sed特殊字符

文章目录

  • sed系列文章
  • 一、sed替换文本语法
    • 1.1、基础语法
    • 1.2、高阶语法
  • 二、实战/实例
    • 2.1、批量替换文件中的内容
    • 2.2、字符串中包含特殊字符
      • 2.2.1、方式一、对特殊字符进行转义
      • 2.2.2、方式二、更换分隔符
    • 2.3、一些特殊字符的使用/替换指定的行
    • 2.4、多个替换在同一个命令中执行
    • 2.5、查找文件并替换内容
    • 2.6、修改文件的同时备份文件
    • 2.7、修改每一行第n次出现的内容
    • 2.8、sed n p(一般和sed s替换一起使用 sed -n 's/pattern/replacement/p')
    • 2.9、sed p用法(查看第几行、范围打印)
    • 2.10、sed w file(将缓冲区中的内容写到指定的 file 文件中)

一、sed替换文本语法

1.1、基础语法

若只是想全局修改文件中的指定内容,掌握此语法就够了,不用再看高阶语法。

# 批量修改文件中的内容
sed -i 's/原字符串/替换字符串/g' filename

说明:

  1. -i:直接修改文件中的内容,并且不在屏幕上输出。不加-i不会修改文件中的内容且会将执行结果输出在屏幕上。
  2. s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个“原字符串”,所有的 “原字符串”都会被替换为 “替换字符串”。如果没有 g 命令,则只将每一行的第一个“原字符串”替换为 “替换字符串”。

1.2、高阶语法

此语法可以修改指定的行、范围修改(如:第二到第五行)等等。

# 批量修改文件中的内容
sed -i '[address]s/pattern/replacement/flags' filename

说明:

  1. -i:直接修改文件中的内容,并且不在屏幕上输出。不加-i不会修改文件中的内容且会将执行结果输出在屏幕上。
  2. address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
  3. s 命令用于替换。
address用法如下:
用法说明
address数字,表示第几行。如3指第三行
address,address1数字,表示从第几行到第几行。如3,5 从第三行到第五行
$表示最后一行。如2,$ 从第二行到最后一行
此命令中常用的 flags 标记如表所示:
flags 标记功能
n1~512 之间的数字,表示指定要替换的字符串在一行中出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file将缓冲区中的内容写到指定的 file 文件中;
&用正则表达式匹配的内容进行替换;
\n匹配第 n 个子串,该子串之前在 pattern 中用 指定。
\转义(转义替换部分包含:&、\ 等)。

二、实战/实例

2.1、批量替换文件中的内容

# 将aa.txt文件中所有的男替换为man
sed -i 's/男/man/g' aa.txt

在这里插入图片描述

2.2、字符串中包含特殊字符

若原字符串或替换字符串中包含特殊字符,可以通过以下方式进行解决。

2.2.1、方式一、对特殊字符进行转义

假如sed s命令中原字符串与替换字符串中包含特殊字符可以转义,特殊字符包含:/、& 等等。

# 示例1:将|替换为&。 字符中包含&,对&进行转义
sed -i 's/|/\&/g' *.txt# 示例2:将/app/name替换为/user/demo 。字符串中包含/,对/进行转义
sed -i 's/\/app\/name/\/user\/demo/g' *.txt

在这里插入图片描述

2.2.2、方式二、更换分隔符

我们上面讲过sed的语法如下。使用/进行分割,sed是允许其他分隔符的:不论什么字符,紧跟着s后面的都会被认为是分隔符。

# 批量修改文件中的内容
sed -i 's/原字符串/替换字符串/g' filename

其他分隔符示例:

[root ~]$ echo "this is /a/b/c" | sed 's#/a/b/c#/x/y/z#g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's@/a/b/c@/x/y/z@g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's!/a/b/c!/x/y/z!g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's|/a/b/c|/x/y/z|g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's_/a/b/c_/x/y/z_g'
this is /x/y/z

这些紧跟在s后面的字符(#、@、!、|、_)都可以作为分隔符,换成这样的表达方式就会清晰很多,推荐使用竖线(|)。当然,如果是输入源/输出内容中有分隔符,依然需要使用反斜杠进行转义。

在这里插入图片描述

2.3、一些特殊字符的使用/替换指定的行

”^”表示行首
”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)

# 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g'      #在所有行首添加
sed 's/$/&添加的尾部/g'      #在所有行末添加
sed '2s/原字符串/替换字符串/g'  #替换第2行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行 

在这里插入图片描述

2.4、多个替换在同一个命令中执行

多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:

# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' 

2.5、查找文件并替换内容

有时候目录下有多个文件都需要修改,可以通过grep命令查找出相应的文件,然后批量替换掉。

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`

在这里插入图片描述

2.6、修改文件的同时备份文件

有时候我们想要一种效果是修改前先备份文件,则可使用以下命令

sed -i.bak 's/原字符串/替换字符串/g' filename-i.bak 表示直接对原文件进行编辑的同时做备份;

在这里插入图片描述
从上图可以看出,sed -i.bak是先将要修改的文件备份后再修改的。

ps: -i后面不一定要是bak,可以指定任何内容,备份文件上会以指定内容结尾,如sed -i.2022,则备份文件名以.2022结尾

2.7、修改每一行第n次出现的内容

# 修改每一行第二次出现的内容
sed -i 's/原字符串/替换字符串/2' filename
# 修改每一行第二次到最后的内容
sed -i 's/原字符串/替换字符串/2g' filename

在这里插入图片描述

可以看到,使用数字 2 作为标记的结果就是,sed 编辑器只替换每行中第 2 次出现的匹配模式。

2.8、sed n p(一般和sed s替换一起使用 sed -n ‘s/pattern/replacement/p’)

我们知道,-n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行,例如:

[root@centos test]# cat aa.txt
| 1 | tom ||
| 2 | jack||
| 3 | cary||
| 4 | cody||
[root@centos test]# sed 's/tom/tony/p' aa.txt   -- 不加-n时会多次输出
| 1 | tony ||
| 1 | tony ||
| 2 | jack||
| 3 | cary||
| 4 | cody||
[root@centos test]# sed -n 's/tom/tony/p' aa.txt  -- 加-n后只输出修改过的行
| 1 | tony ||
[root@centos test]# 

2.9、sed p用法(查看第几行、范围打印)

sed 与p命令一起可以打印第几行、范围打印(从第几行到第几行)、打印匹配的行。

sed -n "/qwf/p" sed.txt   --查看某一行的信息
sed -n "1p" sed.txt    --查看第1行
sed -n "2p" sed.txt    --查看第2行
sed -n "1,2p" sed.txt   --查看1-2行 
sed -n "1p;3p" sed.txt  --查看第1行第3行
[root@www ~]# cat sed.txt 
123
qfq
root
root
root
qwf
ok
This is a test of the trial script.
This is the second test of the trial script.[root@www ~]# sed   "/root/p" sed.txt  -- 每一行打印一次,p命令会把匹配上的再打印一次
123
qfq
root
root
root
root
root
root
qwf
ok
This is a test of the trial script.
This is the second test of the trial script.[root@www ~]# sed -n  "/root/p" sed.txt  --查找某一行的关键字使用-n p选项,n是静默,p是打印
root
root
root[root@www ~]# sed -n 's/disabled/enforcing/p' /etc/selinux/config 
#     enforcing - No SELinux policy is loaded.
SELINUX=enforcing[root@www ~]# sed -n "/qwf/"p sed.txt   --查看某一行的信息
qwf
[root@www ~]# sed -n "1p" sed.txt 
123
[root@www ~]# sed -n "2p" sed.txt 
qfq[root@www ~]# sed -n "1,2p" sed.txt   --查看1-2行 
123
qfq
[root@www ~]# sed -n "1p;3p" sed.txt  --查看第1行第3行
123
root

2.10、sed w file(将缓冲区中的内容写到指定的 file 文件中)

w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:

[address]w filename

下面的例子是将数据流中的前两行打印到一个文本文件中:

[root@localhost ~]# sed '1,2w test.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
[root@localhost ~]# cat test.txt
This is line number 1.
This is line number 2.

示例:将命中的行保存到文本中

[root@centos test]# cat data.txt
This is a test line.
This is a different line.
[root@centos test]# sed 's/test/trial/w test.txt' data.txt  --将命中的内容保存到test.txt文件中
This is a trial line.
This is a different line.
[root@centos test]# cat test.txt
This is a trial line.
[root@centos test]# 

在这里插入图片描述

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

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

相关文章

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三):apply 、edit、delete 1. kubectl apply -f 命令:从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下:kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

Springboot管理系统数据权限过滤(二)——SQL拦截器

上一节Springboot管理系统数据权限过滤——ruoyi实现方案对数据权限实现方案有了认识,本文将进一步优化权限过滤方案,实现对业务代码零入侵。 回顾上一章中权限方案: 主要是通过注解拦截,拼接好权限脚本后,放到对象变…

c题目17:写一个swap函数,可以交换2个整数变量的值。(分别用普通方式和指针方式实现,对比结果)

每日小语 我坐着,观望世界上所有的忧患,所有的压迫和耻辱看着,听着,一声不响。——惠特曼 自己思考 最近这段时间新的感悟似乎也没有,但我发现我和别人的思想越来越不同,只能跟极少数人产生共鸣&#xff0…

DevOps 和人工智能 – 天作之合

如今,人工智能和机器学习无处不在,所以它们开始在 DevOps 领域崭露头角也毫不令人意外。人工智能和机器学习正在通过自动化任务改变 DevOps,并使各企业的软件开发生命周期更高效、更深刻和更安全。我们在 DevOps 趋势中简要讨论过这一问题&am…

使用shell脚本给日志文件瘦身

一、前言 后台系统运行久了,日志文件的体积日渐增多,除了使用常用的日志框架如logback对日志进行按天打印、按大小分割等方式外,还可以使用shell命令来对大日志进行瘦身。 本篇使用sed指令来对文件进行操作,具体操作如下&#xf…

实现进程间的通信

本例程是开发一款能实现进程通信的DLL。本例程以Visual Studio 2015为例。在Visual Studio 2013,Visual Studio 2017都是可以。 第一步:在Visual Studio 2015中,创建DLL工程。如何创建DL,在这里就不作具体说明了。百度都有许多创建…

国际语音群呼系统有哪些应用场景?

国际语音群呼可应用于广告营销、消息通知、客情维护、金融催收等场景,助力出海企业产品营销和品牌推广。 广告营销 出海企业可以通过国际语音群呼系统,向目标市场的潜在客户进行广告宣传。例如,企业可以在系统中录制有关产品的宣传语&#…

发展模式 Fortran 错误记录2023-12-15

/data/chengxl/CAS-ESM2.0-test1/models/atm/iap/src/physics/pbl_iap.F90(476): error #6236: A specification statement cannot appear in the executable section. real(r8) :: rrho(pcols) ! 1/rho m^3/kg -----^ 定义语句不能出现在可执行部分。 我忘记把临时写的定义…

外汇天眼:Coinbase国际交易所将启动现货市场

Coinbase宣布了Coinbase国际交易所扩张的下一阶段——退出符合条件客户的非美国现货市场。 这一最新发展旨在满足Coinbase全球用户群体的独特需求和需求,同时强化其扩大国际访问可信产品和服务的战略使命。 Coinbase国际交易所现货交易的推出和扩展将分阶段进行。1…

Java数据类型相关

数据类型 Java有哪些数据类型 定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类 型,在内存中分配了不同大小的内存空间。 分类: 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…

【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《数据结构奇遇记》🔖墨香寄清辞:墨痕寄壮志,星辰梦未满。 通幽径心凝意,剑指苍穹势如山。 目录 🌞1. 模式匹配的基本概念…

Spring Boot之自定义starter

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Boot的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. starter是什么 二.为什么要使…

计算机操作系统-第十六天

目录 线程的实现方式 用户级线程 内核级线程 多线程模型 一对一模型 多对多模型 多对多模型 本节思维导图 线程的实现方式 用户级线程 历史背景:早期操作系统只支持进程,不支持线程,当时的线程是由线程库实现的 本质:从…

【普中】基于51单片机简易计算器显示设计( proteus仿真+程序+设计报告+实物演示+讲解视频)

目录标题 📟1. 主要功能:📟2. 讲解视频:📟3. 设计说明书(报告)📟4. 仿真📟5. 实物烧录和现象📟6. 程序代码📟7. 设计资料内容清单 【普中开发板】基于51单片机简易计算器…

processon使用及流程图和泳道图的绘画(登录界面流程图,门诊流程图绘制门诊泳道图,住院泳道图,OA会议泳道图),Axure自定义元件

目录 一.processon图形的使用场景介绍 二.流程图绘画 三.泳道图的绘画 1.绘制门诊流程图绘制门诊泳道图 2. 绘制住院泳道图​编辑 3.绘制药库采购入库流程图 4.绘制OA会议泳道图 四.Axure自定义元件 1.Axure载入元件库 一.processon图形的使用场景介绍 二.流程图绘画 示例&…

鸿蒙开发组件之Web

一、加载一个url myWebController: WebviewController new webview.WebviewControllerbuild() {Column() {Web({src: https://www.baidu.com,controller: this.myWebController})}.width(100%).height(100%)} 二、注意点 2.1 不能用Previewer预览 Web这个组件不能使用预览…

《PCL多线程加速处理》-配准-icp

《PCL多线程加速处理》-配准-icp 一、效果展示二、具体实现三、代码一、效果展示 数据越大,速度提升效果越快 1、48万点 2、十万点 3、三万点 4、9000点 配准数据 二、具体实现

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中,外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验,本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术,并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…

小程序 -网络请求post/get

1.1网络请求的概念(post和get) 1.2步骤 1.3 应用函数 js里面写,用bindtap绑在控件上,就不讲了 实例代码: //发起get数据请求get_info(){wx.request({url:https://www.escook.cn/api/get,//请求的接口地址,必须基于https协议//请求的方式met…

SpringBoot项目打成War包部署

简介 一般情况下,在SpringBoot项目开发完成进行服务器部署时,都是打成JAR包进行部署运行的。但是在有些情况下也需要将其打成War包使用Tomcat进行部署。本篇文章就简单介绍一下SpringBoot如何打成War包。 注意: 测试Demo的SpringBoot版本为2…