linux sed批量修改替换文件中的内容/sed特殊字符
时间:2024-04-07 09:10:31 来源:网络cs 作者:胡椒 栏目:卖家故事 阅读:
sed系列文章
linux常用命令(9):sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行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
说明:
-i
:直接修改文件中的内容,并且不在屏幕上输出。不加-i
不会修改文件中的内容且会将执行结果输出在屏幕上。s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个“原字符串”,所有的 “原字符串”都会被替换为 “替换字符串”。如果没有 g 命令,则只将每一行的第一个“原字符串”替换为 “替换字符串”。 1.2、高阶语法
此语法可以修改指定的行、范围修改(如:第二到第五行)等等。
# 批量修改文件中的内容sed -i '[address]s/pattern/replacement/flags' filename
说明:
-i
:直接修改文件中的内容,并且不在屏幕上输出。不加-i
不会修改文件中的内容且会将执行结果输出在屏幕上。address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。s 命令用于替换。 address用法如下:
用法 | 说明 |
---|---|
address | 数字,表示第几行。如3指第三行 |
address,address1 | 数字,表示从第几行到第几行。如3,5 从第三行到第五行 |
$ | 表示最后一行。如2,$ 从第二行到最后一行 |
此命令中常用的 flags 标记如表所示:
flags 标记 | 功能 |
---|---|
n | 1~512 之间的数字,表示指定要替换的字符串在一行中出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; |
g | 对数据中所有匹配到的内容进行替换 ,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; |
p | 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 |
w file | 将缓冲区中的内容写到指定的 file 文件中; |
& | 用正则表达式匹配的内容进行替换; |
\n | 匹配第 n 个子串,该子串之前在 pattern 中用 指定。 |
\ | 转义(转义替换部分包含:&、\ 等)。 |
二、实战/实例
2.1、批量替换文件中的内容
# 将aa.txt文件中所有的男替换为mansed -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 123qfqrootrootrootqwfokThis is a test of the trial script.This is the second test of the trial script. [root@www ~]# sed "/root/p" sed.txt -- 每一行打印一次,p命令会把匹配上的再打印一次123qfqrootrootrootrootrootrootqwfokThis 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是打印rootrootroot [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行 123qfq[root@www ~]# sed -n "1p;3p" sed.txt --查看第1行第3行123root
2.10、sed w file(将缓冲区中的内容写到指定的 file 文件中)
w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:
[address]w filename
下面的例子是将数据流中的前两行打印到一个文本文件中:
[root@localhost ~]# sed '1,2w test.txt' data6.txtThis is line number 1.This is line number 2.This is line number 3.This is line number 4.[root@localhost ~]# cat test.txtThis is line number 1.This is line number 2.
示例:将命中的行保存到文本中
[root@centos test]# cat data.txtThis 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.txtThis is a trial line.[root@centos test]#
阅读本书更多章节>>>>
本文链接:https://www.kjpai.cn/gushi/2024-04-07/155029.html,文章来源:网络cs,作者:胡椒,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:vue实现将自己网站(h5链接)分享到微信中形成小卡片(超详细)
下一篇:返回列表