gpt4 book ai didi

shell - Sed/Awk 在文件中搜索和替换/插入文本

转载 作者:行者123 更新时间:2023-12-01 07:43:54 25 4
gpt4 key购买 nike

我正在尝试在目录 (Linux) 中的所有源文件中更新或插入一些注释,例如版权 header 。我的文件不一致,因此其中一些文件已经有标题,而其他文件则根本没有。我尝试使用 sed 查看前几行并替换。替换我的意思是将已经具有版权标题的文件更改为最新的。

sed -e '1,10 s/Copyright/*Copyright*/g' file

但是,如果它没有找到模式,它将不会插入。我怎样才能做到这一点?

我在评论中提供的示例或我试图实际替换/插入的示例是一个多行典型版权标题,如下所示

/*
* Copyright 1234 XXXNAME, XYZPlace
* text text text text ...........
* blah blah blah */

它也可能包含一些特殊字符。

最佳答案

如果我理解正确,你想:

  • 查找前 10 行中没有版权声明的文件,并且
  • 为这些文件添加版权声明。

此外,您还想:

  • 查找前 10 行带有版权声明的文件,并且
  • 将他们的通知更新为您的标准文本。

在我看来,这两个任务可以归结为一组:

  • 删除前 10 行中的所有现有版权声明,然后
  • 在文件中插入新的版权声明。

如果我们可以安全地假设您在问题的评论中输入的示例文本的缩短版本是有效的,并且应该插入到例如每个文件的第 2 行,那么以下应该实现第一组如果您使用的是 GNU sed,则要求:

find . -type f -not -exec grep -q Copyright {} \; -exec sed -i'' '2i/* Copyright */' {} \;

如果您没有运行 GNU sed(即您使用的是 FreeBSD、OSX 或 Solaris 等),请告诉我们,因为 sed 脚本会有所不同。

这是如何工作的

find 命令获得以下选项:

  • -type f 告诉它只查看文件(而不是目录或设备)。
  • -not 反转以下选项。
  • -exec grep -q Copyright {}\; 将搜索限制为包含版权的任何内容(由 -not 修改)
  • -exec sed -i'' '2i/* Copyright */' {}\; 插入您的版权声明。

如果您希望您的版权声明包含将由 sed 脚本解释的特殊字符,此解决方案可能会遇到困难。但它回答了你的问题。 :)

如果相反,我们想要处理修订后的要求,即首先删除现有的版权声明,那么我们可以使用两个单行来做到这一点:

首先,我们删除现有的版权声明。

find . -type f -exec sh -c 'head {} | grep -q Copyright' \; -exec sed -ne '10,$ta;/Copyright/d;:a;p' {} \;

这可能有点多余,除非你想递归地遍历子目录,find 默认会这样做。 sed 脚本对前 10 行中没有版权信息的文件不执行任何操作,因此如果您的所有文件都在一个目录中,则以下内容也应该起作用:

for file in *;do sed -ne '10,$ta;/Copyright/d;:a;p' "$file"; done

接下来,我们重新添加新的。

for file in *;do sed -i'' '2i/* Copyright */' "$file"; done

或者,如果您想通过子目录递归地执行此操作:

find . -type f -exec sed -i'' '2i/* Copyright */' {} \;

最终更新:

在这之后我不能再花更多时间在这上面了。

find . -type f \
-exec sh -c 'head {} | grep -q Copyright' \; \
-exec sed -ne '1h;1!H;${;g;s:/\*.*Copyright.*\*/:/* Copyright 1998-2012 */' {} \;

什么

第一个 -exec 在文件的前 10 行中搜索单词“Copyright”。就像我在上面发布的第一个示例一样。如果 grep 找到任何内容,则此条件返回 true。

第二个 -exec 进行替换。它将整个文件读入 sed 的保持缓冲区。然后,当它到达文件末尾时,它 (g) 考虑保持缓冲区,并且 (s) 执行多行替换。

请注意,这很可能需要一些调整,如果您在文件的其他地方有注释,它可能根本不起作用。我不记得 GNU sed 是否支持非贪婪星。你可以自己研究一下。

这是我的测试:

$ printf 'one\n/* Copyright blah blah\n *\n */\ntwo\n' | sed -n '1h;1!H;${;g;s:/\*.*Copyright.*\*/:/* Copyright 1998-2012 */:g;p;}'
one
/* Copyright 1998-2012 */
two

维护您现有的版权信息,但至少它解决了多行问题。

关于shell - Sed/Awk 在文件中搜索和替换/插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11563620/

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