Linux Sed 教程:使用RegEx在文件中查找和替换文本

举报
Tiamo_T 发表于 2022/01/02 16:10:42 2022/01/02
【摘要】 在这篇文章中,让我们了解一下如何使用 sed 替代命令“s”。 `s' 命令可能是 `sed' 中最重要的命令,它有很多不同的选项。

在这篇文章中,让我们了解一下如何使用 sed 替代命令“s”。

`s' 命令可能是 `sed' 中最重要的命令,它有很多不同的选项。


`s' 命令尝试将模式空间与提供的 REGEXP 进行匹配;如果匹配成功,那么匹配的那部分模式空间将被替换为 REPLACEMENT。

Syntax:

#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
#sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename
  • s 是替代命令
  • / 是分隔符
  • REGEXP 是要匹配的正则表达式
  • REPLACEMENT 是一个要替换的值

FLAGS 可以是以下任何一种

  • g 用 REPLACEMENT 替换 REGEXP 的所有实例
  • n 可以是任何数字,用 REPLACEMENT 替换 REGEXP 的第 n 个实例。
  • p 如果进行了替换,则打印新的模式空间。
  • 我以不区分大小写的方式匹配 REGEXP。
  • w file 如果进行了替换,则将结果写到给定的文件中。
  • 我们可以使用不同的分隔符(@% ; : 之一)而不是 /

让我们首先创建将在下面提到的所有示例中使用的 geekstuff.txt 文件。


$ cat tiamotxt.txt
# Instruction Guides
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

现在让我们回顾一些有趣的替代示例。

1. 使用 sed s// 将单词“Linux”替换为“Linux-Unix”

在下面的示例中,在输出行“1. Linux-Unix 系统管理员、Linux 脚本等”只是第一个 Linux 被 Linux-Unix 取代。如果未指定标志,则替换行的第一个匹配项。

$ sed 's/Linux/Linux-Unix/' tiamotxt.txt
# Instruction Guides
1. Linux-Unix Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

2. 使用 sed s//g 替换单词的所有外观

下面的 sed 命令使用全局替换标志“g”将所有出现的 Linux 替换为 Linux-Unix。

$ sed 's/Linux/Linux-Unix/g' tiamotxt.txt
# Instruction Guides
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

3. 使用 sed s//2 只替换第二次出现的单词

在下面的示例中,在输出行“1. Linux 系统管理员、Linux-Unix 脚本等。” 只有第二次出现的 Linux 被 Linux-Unix 取代。

$ sed 's/Linux/Linux-Unix/2' tiamotxt.txt
# Instruction Guides
1. Linux Sysadmin, Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

4. 将更改写入文件并使用 sed s//gpw 打印更改

下面的示例使用三个标志进行替换。它将所有出现的 Linux 替换为 Linux-Unix,并打印替换的输出并将相同的内容写入给定的文件。

$ sed -n 's/Linux/Linux-Unix/gpw output' tiamotxt.txt
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix
$ cat output
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix

5. 仅当行与模式匹配时才替换使用 sed

在此示例中,如果该行与模式“-”匹配,则它将“-”中的所有字符替换为空。

$ sed '/\-/s/\-.*//g' tiamotxt.txt
# Instruction Guides
1. Linux Sysadmin, Linux Scripting etc.
2. Databases
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows

6. 使用 sed 从每行中删除最后 X 个字符

此 sed 示例从每行中删除最后 3 个字符。

$ sed 's/...$//' tiamotxt.txt
# Instruction Gui
1. Linux Sysadmin, Linux Scripting e
2. Databases - Oracle, mySQL e
3. Security (Firewall, Network, Online Security e
4. Storage in Li
5. Productivity (Too many technologies to explore, not much time availab
#  Additional F
6. Windows- Sysadmin, reboot e

7. 使用 sed 消除注释

使用 sed 命令删除文件中的所有注释行,如下所示。

$  sed -e 's/#.*//' tiamotxt.txt

1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)

6. Windows- Sysadmin, reboot etc.

8. 使用 sed 消除注释和空行

在这个例子中,有两个命令以“;”分隔

  • 第一个命令将以 # 开头的行替换为空行
  • 第二个命令删除空行。
$ sed -e 's/#.*//;/^$/d'  tiamotxt.txt
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)
6. Windows- Sysadmin, reboot etc.

9. 使用 sed 将 DOS 换行符 (CR/LF) 转换为 Unix 格式

将 DOS 文件复制到 Unix,您可以在每行末尾找到 \r\n。

本示例使用 sed 命令将 DOS 文件格式转换为 Unix 文件格式。

$sed 's/.$//' filename

10. 使用 sed 从文件中删除 HTML 标签

在这个例子中,sed 命令中给出的正则表达式匹配 html 标签并替换为空。

$ sed -e 's/<[^>]*>//g'
This <b> is </b> an <i>example</i>.
This  is  an example.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。