【问题标题】:How to change certain text in all files using bash?如何使用 bash 更改所有文件中的某些文本?
【发布时间】:2019-08-05 10:28:55
【问题描述】:

我有几个目录,里面都有自己的 index.html 文件。我想扫描这些目录(我不知道它们会有多少以及如何命名)并在它们包含的所有 index.html 文件中替换一行。

我要查找的行是base href="。我想在这个字符串的末尾放置一个给定的文本。例如,文本可能是:/testing/demo。然后我希望所有 index.html 文件都包含base href="/testing/demo

此外,还必须执行两个额外的步骤 - 如果给定字符串的末尾有斜线 /,则应将其删除。如果开头没有斜线,则应该添加它。

我试图以某种方式使用sed 命令。

【问题讨论】:

  • 您能否添加一个完整的示例,它的外观和您的期望如何?
  • 它还不存在,我想将它添加到我的部署脚本中。我想到了类似的东西:for d in $(find ${S3_URI} -type d); do find $d -iname "index.html" .............
  • 然后使用sed命令替换字符串。
  • wrt It doesn't exist yet - 我们要求您创建并发布一个示例。见How to Ask
  • @EdMorton 当问“如何写东西”时,我该如何提供一个例子?我只是在寻找一些解决方案。在上面的评论中,我写了我想如何解决这个问题。

标签: bash sed sh


【解决方案1】:

您可以使用以下命令查找所有index.html文件并在base href="之后添加字符串:

不要忘记将-i 作为选项添加到sed 以使其修改到位

-E 用于扩展正则表达式用法,如下所述:

-E, -r, --regexp-扩展 在脚本中使用扩展正则表达式 (为了便于携带,请使用 POSIX -E)。

我们首先查找每个index.html 文件,而不区分大小写。然后我们使用sed 找到base href= 并将其捕获到一个组中,然后我们将它作为\1 传递给sed 命令的第二部分,然后我们添加我们想要附加的字符串。

对于问题的第二部分,我们可以考虑删除字符串开头的任何/,并删除末尾的任何/,并将结果保存在一个变量中,该变量将传递给sed

PARSED_URL=$(echo '/testing/demo/' | grep -oP '[^/].*[^/$]') ; find /path/you/want/to/lookup/ -iname "index.html" -exec sed -E "s~(base\shref=\")~\1/$PARSED_URL~g" {} \;

输入 1:

/testing/demo/

输入 2:

testing/demo/

输入 3:

/testing/demo

输入 4:

testing/demo

输出(附加到base href="之后)

base href="/testing/demo

【讨论】:

  • 这里的-E标志是什么意思?
  • 答案已更新。如果需要任何其他修改,现在让我来更新答案
  • 这是一个非常好的答案,但缺少我的问题的一个方面:if there's a slash / at the end of the given string, it should delete it. If there's not a slash at the beginning, it should add it.
  • 一切正常,我在控制台中获取了更新后的 index.html 文件,但该文件未与新内容一起保存。我怎样才能实现这最后一步? :)
  • 这是因为你需要在sed命令中添加-i,我只是不想添加它,所以你可以先查看结果
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2019-10-18
  • 2013-04-02
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多