Linux如何批量替换文本文件内容

请关注本头条号,每天坚持更新原创干货技术文章。

如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

1. 前言

sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理模式空间中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,因为这些都在模式空间处理的。Sed可以用来自动编辑一个或多个文件。

Linux批量替换文件内容

普及一下正则表达式的一些基本知识:

^ 表示一行的开头。如:/^#/ 以#开头的匹配。

不能识别此Latex公式:
 表示一行的结尾。如:/}
   

/ 以}结尾的匹配。

< 表示词首。 如:<abc 表示以 abc 为首的詞。

\> 表示词尾。 如:abc\> 表示以 abc 結尾的詞。

. 表示任何单个字符。

  • 表示某个字符出现了0次或多次。
  • [ ] 字符集合。 如:[abc] 表示匹配a或b或c,还有 [a-zA-Z] 表示匹配所有的26个字符。如果其中有^表示反,如 [a] 表示非a的字符

2. sed命令选项

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在命令列模式上进行 sed 的动作编辑;

-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]function

n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』

function:

a\ 在当前行下面插入文本。

i\ 在当前行上面插入文本。

c\ 把选定的行改为新的文本。

d 删除,删除选择的行。

D 删除模板块的第一行。

s 替换指定字符

h 拷贝模板块的内容到内存中的缓冲区。

H 追加模板块的内容到内存中的缓冲区。

g 获得内存缓冲区的内容,并替代当前模板块中的文本。

G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。

l 列表不能打印字符的清单。

n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

p 打印模板块的行。

P(大写) 打印模板块的第一行。

q 退出Sed。

b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

r file 从file中读行。

t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

w file 写并追加模板块到file末尾。

W file 写并追加模板块的第一行到file末尾。

! 表示后面的命令对所有没有被选定的行发生作用。

= 打印当前行号码。

# 把注释扩展到下一个换行符以前。

Linux sed命令详解

3. 测试文件说明

复制/etc/passwd到~/zcwyou.txt

[root@zcwyou ~]# cp /etc/passwd ~/zcwyou.txt
   

下文以zcwyou.txt作说明。

4. 使用sed删除输出结果某些行

打印zcwyou.txt的内容并附带行号,不显示3-7行

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '3,7d'
   

sed 的动作为 '3,7d' ,d表示删除。同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!

5. 删除特定的行

把输出结果删除第2行。

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2d'
   

删除带有123的行:

[root@zcwyou ~]# sed '/123/d' zcwyou.txt
   

删除第二行

[root@zcwyou ~]# sed '2d' zcwyou.txt
   

删除第2行到最后一行。

[root@zcwyou ~]# sed '2,$d' zcwyou.txt
   

6. 从某行开始删除

要删除第 3 到最后一行

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '3,$d'
   

7. 使用sed添加行

在第二行后面加上字符串hello jack

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2a hello jack'
   

在第二行前面加上字符串hello jack

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2i hello jack'
   

以行为单位的替换与显示

将第2-5行的内容取代成为Line2-5

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2,5c Line2-5'
   

8. 根据条件仅列出某些行

仅列出 ~/zcwyou.txt 文件内的第 5-7 行

[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '5,7p'
   

9. 使用sed查找数据

打印~/zcwyou.txt的内容,查找带root的行并打印2次。

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '/root/p'
   

如果root找到,除了输出所有行,还会输出匹配行。

[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/root/p'
   

查看关键词并删除

删除~/zcwyou.txt所有包含root的行,输出其他内容

[root@zcwyou ~]# nl ~/zcwyou.txt | sed '/root/d'
   

10. 查看关键词并执行命令

搜索~/zcwyou.txt,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为abcshell,再输出这行:

[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/root/{s/bash/abcshell/;p}'
   

如果只替换~/zcwyou.txt的第一个bash关键字为abcshell,完成后自动退出

[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/bash/{s/bash/abcshell/;p;q}'
   

11. 打印奇数行或偶数行

方法1:

奇数行

[root@zcwyou ~]# sed -n 'p;n' zcwyou.txt
   

偶数行

[root@zcwyou ~]# sed -n 'n;p' zcwyou.txt
   

方法2:

奇数行

[root@zcwyou ~]# sed -n '1~2p' zcwyou.txt
   

偶数行

[root@zcwyou ~]# sed -n '2~2p' zcwyou.txt
   

打印匹配字符串的下一行

[root@zcwyou ~]# grep -A 1 SCC zcwyou.txt
[root@zcwyou ~]# sed -n '/SCC/{n;p}' zcwyou.txt
[root@zcwyou ~]# awk '/SCC/{getline; print}' zcwyou.txt
   

12. 查找关键词并替换

格式:

sed 's/要被取代的字串/新的字串/g'

先看看现有的样版文件内容:

[root@zcwyou ~]# cat sshforwarding.service
   

输出结果:

[Unit]

Description=SSH Forward TCP Port 9001 To SS Server

Documentation=https://linux.die.net/man/1/ssh

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

ExecStart=/usr/bin/ssh -NT -f -L my_public_ip:9001:SS_server:9001 localhost

ExecReload=/bin/kill -HUP

MAINPID

[Install]

WantedBy=multi-user.target

要求把以上文本中的9001替换为9002

替换命令:

[root@zcwyou ~]# sed "s/9001/9002/g" sshforwarding.service
   

输出结果:

[Unit]

Description=SSH Forward TCP Port 9002 To Shadowsocks Server

Documentation=https://linux.die.net/man/1/ssh

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

ExecStart=/usr/bin/ssh -NT -f -L my_public_ip:9002:shadowsocks_server:9002 localhost

ExecReload=/bin/kill -HUP

MAINPID

[Install]

WantedBy=multi-user.target

可以看到,9001已经被换为9002,但这样并没有修改源文件,也没有保存为新文件,我们需要把它重定向保存为新文件。

替换后保存为新文件:

[root@zcwyou ~]# sed "s/9001/9002/g" sshforwarding.service > sshforwarding9002.service
   

这样就可以保存为新文件sshforwarding9002.service

如果只替换第4到第8行的文本内容,命令如下:

[root@zcwyou ~]# sed "4,8s/9001/9002/g" zcwyou.txt
   

只替换每一行的第一个abc:

[root@zcwyou ~]# sed 's/abc/S/1' zcwyou.txt
   

只替换每一行的第二个abc:

[root@zcwyou ~]# sed 's/abc/S/2' zcwyou.txt
   

只替换第一行的第3个以后的abc:

[root@zcwyou ~]# sed 's/abc/S/3g' zcwyou.txt
   

13. 替换匹配行

使用选项c

把zcwyou.txt的第二行替换为line 2

[root@zcwyou ~]# sed "2 c line 2" zcwyou.txt
   

查看带有abc的行,替换内容为line hahaha

[root@zcwyou ~]# sed "/abc/c line hahaha" zcwyou.txt
   

sed替换标记

linux sed 替换字符串

g 表示行内全面替换。

p 表示打印行。

w 表示把行写入一个文件。

x 表示互换模板块中的文本和缓冲区中的文本。

y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)

\1 子串匹配标记

& 已匹配字符串标记

14. sed同时执行多任务

一条sed命令,删除~/zcwyou.txt第三行到末尾的数据,并把bash替换为abcshell

[root@zcwyou ~]# nl ~/zcwyou.txt | sed -e '3,$d' -e 's/bash/abcshell/'
   

-e表示多点编辑,第一个动作是删除~/zcwyou.txt第三行到末尾的数据,第二条命令搜索bash替换为abcshell。

15. 使用sed直接修改文件内容(危险不建议)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以建议找一个无用的文件做测试,比如本文里的zcwyou.txt,仅仅用来实验研究。

利用sed将zcwyou.txt内的每一行结尾a换成b

[root@zcwyou ~]# sed -i 's/a$/b/g' zcwyou.txt
   

利用 sed 直接在zcwyou.txt 最后一行加入字符end

[root@zcwyou ~]# sed -i '$a end' zcwyou.txt
   

$代表的是文件最后一行,而a表示新增内容,因此执行结果是使该文件最后一行新增字符end。不要忘记了,该方法是直接修改源文件,除非你清楚清楚后果,强烈建议使用副本修改并确认无误后才覆盖线上的配置环境。

sed的-i选项非常实用,特别是遇到大文件要修改时,如果你使用vi或vim修改,效率将会非常低。而使用sed,它会自动查找并按要求完成,非常处理速度极为迅速,几乎没有等待。

本文已同步至博客站,尊重原创,转载时请在正文中附带以下链接:

https://www.linuxrumen.com/cyml/852.html

点击了解更多,快速查看更多的技术文章列表。

(0)

相关推荐

  • linux下批量替换文件内容的方法

    对于单个文件,使用sed命令很容易做到。如果需要替换某个指定文件夹下所有文件,借助grep和sed组合成一条命令也可以轻松搞定。 grep命令可以查找单个文件或文件夹下文件中的内容,使用参数“r”或“ ...

  • linux下批量替换文件中的内容

    grep命令可以查找单个文件或文件夹下文件中的内容,使用参数“r”或“-R”可以递归查找指定文件夹下的所有文件;参数“l”可以让grep输出包含指定字符串的文件名,首次匹配成功后立刻停止对同文件的查询 ...

  • linux下perl,sed,shell批量替换文件内容

    方法1: 这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的 ...

  • 如何在WPS文档中进行批量替换文字内容

    今天给大家介绍一下如何在WPS文档中进行批量替换文字内容的具体操作步骤.1. 首先我们打开电脑,选择新建一个wps文档,然后双击打开2. 在里面输入一些文字,然后想要将其中的文字内容进行替换3. 按键 ...

  • 批量替换文件内容的方法

    批量替换文件内容的方法 修改文件时常常会遇到需要将某些相同的字符 替换修改成另一个相同的字符 (比如将网站源码中的网址修改成自己的网址 ) 一个一个的去改 肯定会很麻烦 .如果能做到批量修改那就简单多 ...

  • excel批量替换公式内容

    每次月考完后,年级总是把年级总成绩单上各分数段各班有多少人统计一下.统计的公式还是原来的,但这次的统计分值和人数都有变化,想把公式里的值换一下,可一个一个的但麻烦了,所以用批量还是来的快些. 操作方法 ...

  • sed批量替换文件内容(sed替换某一行的特定内容)

    概述sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的.在shell中,使用sed来批量修改文本内容是非常方便的.sed命令的选项语法: ...

  • vba批量替换excel内容(vba批量替换字符串中的字符)

    No.1Excel中查找和替换是一个基本功能,Range对象有一个很好的方法可以解决这个问题.想要得到这个结果,用到一个方法.Replace语法:Range.Replace(What.Replacem ...

  • linux中批量查找替换文本内容例子

    .批量查找某个目下文件的包含的内容,例如: # grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容。 # sed -i "s/要找查找的文本/替换后的文本/g" `grep -rl ...

  • linux从指定ID批量替换sql文件中记录的方法

    当数据库中的某个字段(例如ID)是整型,那么当新插入数据的时候需要从目前已有的数据库总最大的值加1开始排列。 当前生产数据库的id最大值为150,那么上线时候需要从151开始编号,当然可以使用sequ ...