如何使用bash更改所有文件中的某些文本?

时间:2019-03-14 13:40:53

标签: bash sed sh

我有几个目录,所有目录中都有它自己的index.html文件。我想扫描这些目录(我不知道它们的名称和名称),并在其中包含的所有index.html文件中替换一行。

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用以下命令查找所有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