51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1408|回复: 1
打印 上一主题 下一主题

巧妙运用Linux sed 命令进行自动化文件编辑实践

[复制链接]
  • TA的每日心情
    无聊
    13 小时前
  • 签到天数: 946 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-8-18 12:00:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    当我使用 Linux 命令行时,无论是在台式机上编写新程序还是在 Web 服务器上管理网站,我经常需要处理文本文件。Linux 提供了强大的工具,我可以利用这些工具来完成我的工作。我经常使用 sed,一个可以根据模式修改文本的编辑器。
      sed? 代表 流编辑器,它编辑文件中的文本并打印结果。使用 sed? 的一种方法是识别一个字符串在文件中的几次出现,并将它们替换为不同的字符串。使用 sed? 来处理文本文件的方式似乎是无穷无尽的,但我想分享一些使用 sed 来帮助我管理文件的方法。
      在 Linux 上搜索和替换文件中的文本
      要使用 sed,你需要使用一个正则表达式。正则表达式是定义模式的一组特殊字符。我最常使用 sed的例子是替换文件中的文本。替换文本的语法如下:s/originaltext/newtext。s? 告诉 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 处理文本文件。





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-10-13 13:59
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2023-3-16 12:19:18 | 只看该作者
    感谢楼主很实用的分享
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-10 22:44 , Processed in 0.062978 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表