gpt4 book ai didi

linux - 找到两行并替换为一行

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:20 26 4
gpt4 key购买 nike

我正在寻找一种解决方案,它允许我在 linux 服务器上搜索文本文件,该文件将查找文件并找到诸如以下的模式:

Text 123
Blue Green

然后每次在文件中找到它时用一行替换它...

Order Blue Green

我不确定解决这个问题的最简单方法是什么。我看过许多使用 SED 的指南,但只是为了找到一行并替换它。

最佳答案

你问sed,这里有sed的回答。
不过,让我提一下,虽然 sed 对于这种练习很有趣,但您可能应该选择其他更灵活、更容易学习的东西;例如 perl。

  • 寻找第一行 /Text 123/
  • 当找到时开始循环 :a
    • 连接下一行 N
    • 用单个副本替换成对的搜索文本并打印
      s/Text 123\nText 123/Text 123/p;
    • 循环 while 替换 ta;
  • 尝试替换s///
  • 如果 replace 没有触发,则依赖 concat 不变地打印

代码:

sed "/Text 123/{:a;N;s/Text 123\nText 123/Text 123/p;ta;s/Text 123\nBlue Green/Order Blue Green/}"

测试输入:

Text 123
Do not replace
Lala
Text 123
Blue Green
lulu
Text 123
Do not replace either
Text 123
Text 123
Blue Green
preceding should be replaced

输出:

Text 123
Do not replace
Lala
Order Blue Green
lulu
Text 123
Do not replace either
Text 123
Order Blue Green
preceding should be replaced

平台:Windows 和 GNU sed 4.2.1 版

注意:在该平台上,sed 行允许为两个文本片段使用环境变量,您可能想要这样做:

sed "/%EnvVar2%/{:a;N;s/%EnvVar2%\n%EnvVar2%/%EnvVar2%/p;ta;s/%EnvVar2%\n%EnvVar%/Order %EnvVar%/}"

平台2:
仍然是 Windows
使用 bash GNU bash,版本 3.1.17(1)-release (i686-pc-msys)
GNU sed 版本 4.2.1(相同)

在此平台上,变量可以例如像这样使用:

sed "/${EnvVar2}/{:a;N;s/${EnvVar2}\n${EnvVar2}/${EnvVar2}/p;ta;s/${EnvVar2}\n${EnvVar}/Order ${EnvVar}/}"

在这个平台上,重要的是使用"..." 以便能够使用变量,
它不适用于 '...'

正如@edMorton 所暗示的,在所有平台上要小心尝试替换(使用变量)看起来像使用变量的文本。例如。在 bash 中使用“Text $123”。在这种情况下,不使用变量而是尝试替换看起来像变量的文本,使用 '...' 而不是 "..." 是可行的方法。

关于linux - 找到两行并替换为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44553436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com