Redian新闻
>
如何使用 Linux sed 命令自动进行文件编辑 | Linux 中国

如何使用 Linux sed 命令自动进行文件编辑 | Linux 中国

科技
 
导读:以下是从 Linux 命令行自动编辑文件的一些提示和技巧。                           
本文字数:4086,阅读时长大约:5分钟

以下是从 Linux 命令行自动编辑文件的一些提示和技巧。

当我使用 Linux 命令行时,无论是在台式机上编写新程序还是在 Web 服务器上管理网站,我经常需要处理文本文件。Linux 提供了强大的工具,我可以利用这些工具来完成我的工作。我经常使用 sed,一个可以根据模式修改文本的编辑器。

sed 代表 流编辑器(Stream EDitor),它编辑文件中的文本并打印结果。使用 sed 的一种方法是识别一个字符串在文件中的几次出现,并将它们替换为不同的字符串。使用 sed 来处理文本文件的方式似乎是无穷无尽的,但我想分享一些使用 sed 来帮助我管理文件的方法。

在 Linux 上搜索和替换文件中的文本

要使用 sed,你需要使用一个正则表达式。正则表达式是定义模式的一组特殊字符。我最常使用 sed 的例子是替换文件中的文本。替换文本的语法如下:s/originaltext/newtexts 告诉 sed 执行文本替换或交换出现的文本。在斜线之间提供原始文本和新文本。

此语法将仅替换每行中第一次出现的 originaltext。要替换每个匹配项,即使在一行中原始文本出现了不止一次,要将 g 追加到表达式的末尾。例如:s/originaltext/newtext/g

要在 sed 中使用此表达式,请使用 -e 选项指定此正则表达式:

  1. $ sed -e 's/originaltext/newtext/g'

例如,假设我有一个名为 game 程序的 Makefile 文件,该程序模拟了康威的《生命游戏》:

  1. .PHONY: all run clean
  2. all: game
  3. game: game.o
  4.         $(CC) $(CFLAGS) -o game game.o $(LDFLAGS)
  5. run: game
  6.         ./game
  7. clean:
  8.         $(RM) *~
  9.         $(RM) *.o
  10.         $(RM) game

game 这个名字并不是很有描述性,所以我想会把它改名为 life。将 game.c 源文件重命名为 life.c 非常简单,但现在我需要修改 Makefile 以使用新名称。我可以使用 sed 来将所有的 game 更改为 life

  1. $ sed -e 's/game/life/g' Makefile
  2. .PHONY: all run clean
  3. all: life
  4. life: life.o
  5.         $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
  6. run: life
  7.         ./life
  8. clean:
  9.         $(RM) *~
  10.         $(RM) *.o
  11.         $(RM) life

sed 会将输出打印到屏幕上,这是检查文本替换是否符合你要求的好方法。要对 Makefile 进行这些更改,首先,备份文件,然后运行 sed 并将输出保存到原始文件名:

  1. $ cp Makefile Makefile.old
  2. $ sed -e 's/game/life/g' Makefile.old > Makefile

如果你确信你的更改正是你想要的,请使用 -i 或 --in-place 选项来编辑文件。但是,我建议添加一个备份文件后缀,如 --in-place=.old,用来备份原始文件,以备日后需要恢复时使用。它看起来像这样:

  1. $ sed --in-place=.old -e 's/game/life/g' Makefile
  2. $ ls Makefile*
  3. Makefile  Makefile.old

在 Linux 上使用 sed 引用文件

你可以使用正则表达式的其它功能来匹配特定的文本实例。例如,你可能需要替换出现在行首的文本。使用 sed,你可以用上尖号 ^ 来匹配行的开头。

我使用“行首”来替换文本的一种方式是当我需要在电子邮件中引用一个文件时。假设我想在电子邮件中共享我的 Makefile,但我不想将其作为文件附件包含在内。相反,我更喜欢在电子邮件正文中“引用”文件,在每行之前使用 >。我可以使用以下 sed 命令将编辑后的版本打印到我的终端,并将其复制粘贴到新的电子邮件中:

  1. $ sed -e 's/^/>/' Makefile
  2. >.PHONY: all run clean
  3. >
  4. >all: life
  5. >
  6. >life: life.o
  7. >       $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
  8. >
  9. >run: life
  10. >       ./life
  11. >
  12. >clean:
  13. >       $(RM) *~
  14. >       $(RM) *.o
  15. >       $(RM) life

s/^/>/ 正则表达式匹配每行的开头(^),并在那里放置一个 >。实际上,这相当于每行都以 > 符号开始。

制表符可能无法在电子邮件中正确显示,但我可以通过添加另一个正则表达式将 Makefile 中的所有制表符替换为几个空格:

  1. $ sed -e 's/^/>/' -e 's/\t/  /g' Makefile
  2. >.PHONY: all run clean
  3. >
  4. >all: life
  5. >
  6. >life: life.o
  7. >  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
  8. >
  9. >run: life
  10. >  ./life
  11. >
  12. >clean:
  13. >  $(RM) *~
  14. >  $(RM) *.o
  15. >  $(RM) life

\t 表示文字制表符,因此 s/\t/ /g 告诉 sed 用输出中的两个空格替换输入中的所有制表符。

如果你需要对文件进行大量编辑,你可以将 -e 命令保存在文件中,并使用 -f 选项来告诉 sed 将该文件用作“脚本”。如果你需要经常进行相同的编辑,这种方法特别有用。我已经准备了 quotemail.sed 的脚本文件来在我的电子邮件中引用 Makefile:

  1. $ cat quotemail.sed
  2. s/^/>/
  3. s/\t/  /g
  4. $ sed -f quotemail.sed Makefile
  5. >.PHONY: all run clean
  6. >
  7. >all: life
  8. >
  9. >life: life.o
  10. >  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
  11. >
  12. >run: life
  13. >  ./life
  14. >
  15. >clean:
  16. >  $(RM) *~
  17. >  $(RM) *.o
  18. >  $(RM) life

学习在 Linux 上使用 sed

sed 是一个很好的工具,可以保存在你的 Linux 命令行工具包中。浏览 sed 手册页并了解有关如何使用它的更多信息。在命令行中键入 man sed 以获取有关不同命令行选项的完整文档,以及如何使用 sed 处理文本文件。


via: https://opensource.com/article/22/8/automate-file-edits-sed-linux

作者:Jim Hall 选题:lkxed 译者:perfiffer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


LCTT 译者 :perfiffer
🌟🌟🌟
翻译: 21.0 篇
|
贡献: 386 天
2021-07-24
2022-08-13
https://linux.cn/lctt/perfiffer
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
你应该知道的 22 个基本的 Linux 网络命令 | Linux 中国在 Linux 中使用 Etcher 创建可启动 USB – 下载和使用指南 | Linux 中国我如何使用 Groovy 分析我的音乐目录 | Linux 中国检查 Linux 磁盘使用情况 | Linux 中国“作弊”:只需要知道这一个 Linux 命令就够了 | Linux 中国女人为何喜欢逛街 缺乏方向感德州夏天太热,真跑不动。如何在 Linux 中使用 Pandoc 转换文件格式 | Linux 中国Linux inxi 命令的 3 种使用方法 | Linux 中国如何在 Linux 中实时监控日志文件(桌面和服务器) | Linux 中国(老友记第一部) 奔着出轨去遛弯儿 (3 )在 Linux 上使用 Bash 创建一个临时文件 | Linux 中国这台卖4000元的中端机,征服了差评的所有硬件编辑。Linux——如何使用 evilscan 扫描网络我是如何使用 Linux fmt 命令来格式化文本 | Linux 中国如何使用原生 NTFS 驱动替代旧版 FUSE NTFS 驱动 | Linux 中国我如何使用现场 USB 设备恢复我的 Linux 系统 | Linux 中国企业为何使用开源软件,又为何推动开源软件的发展 | Linux 中国我如何使用开源玩 RPG 游戏 | Linux 中国10 大可以摧毁你的 Linux 的命令 | Linux 中国在 Ubuntu 和 Debian 中使用 apt 命令更新单个软件包 | Linux 中国用这些开源工具在 Linux 上编辑 PDF 文件 | Linux 中国教你如何使用 htmlq 提取 html 文件内容GNOME “文件”引入最受欢迎的功能:“新建文件”菜单 | Linux 中国周末愉快 日出在 Linux 中隐藏文件和文件夹的那些事 | Linux 中国如何使用 FreeDOS Edit | Linux 中国Tuxedo 已对所有用户开放基于 Ubuntu 的 TUXEDO OS | Linux 中国用 ranger 在 Linux 终端管理你的文件 | Linux 中国使用 Podman Desktop 在 Fedora Linux 上管理容器 | Linux 中国如何在 sudo 运行的命令中防止使用参数 | Linux 中国如何在 Ubuntu/Linux 和 Windows 之间共享文件夹 | Linux 中国如何在 Linux 中使用媒体传输协议访问安卓设备的内部存储和 SD 卡 | Linux 中国性感的女人不说话如何使用 Dockerfile 创建自定义 Docker 镜像 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。