如何在 bash/sed 中替换此值

Ser*_*erg 2 sed text-processing

在我的文件中包含以下文本

http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
Run Code Online (Sandbox Code Playgroud)

我需要这个(我想我需要使用 sed?)

http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
Run Code Online (Sandbox Code Playgroud)

rem*_*mmy 6

sed 's/\([^/]*\)\.phtml$/mydirectory\/\1.php/' <filename>
Run Code Online (Sandbox Code Playgroud)

会这样做,如果这是你需要的。(可选择使用-i标志进行就地替换。)


为了打破它,首先我们有

s/<regexp>/<replacement>/
Run Code Online (Sandbox Code Playgroud)

这将替换<regexp><replacement>. 接下来让我们看看我们拥有的正则表达式:

\([^/]*\)\.phtml$
Run Code Online (Sandbox Code Playgroud)

首先,在最后我们\.phtml$将查找.phtml行尾的字符串。$将正则表达式锚定到行尾,点前面有一个反斜杠来转义它,因为通常点匹配任何东西。

之后我们剩下的是:

\([^/]*\)
Run Code Online (Sandbox Code Playgroud)

从中间看,我们[^/]将匹配一个字符([]将匹配方括号内的一个字符),它可以是任何不是斜杠的东西,因为^会进行否定匹配,所以^/在方括号内“除了斜线”。右方括号后有一个星号 ,*表示它将匹配方括号内的一个或多个字符。

然后将上面的内容包裹起来\(\)这将捕获括号内匹配的内容,并让您在 的<replacement>部分中s/<regexp>/<replacement>/使用它们,以便我们可以使用它们。

然后在该<replacement>部分,我们有:

mydirectory\/\1.php/
Run Code Online (Sandbox Code Playgroud)

它将匹配的 rexecp 替换为 first mydirectory/,需要替换的斜线/作为 sed 替换的分隔符,然后\1用于放入第一个捕获组中捕获的文本,然后我们添加.php扩展名在末尾。


所有这些加在一起意味着我们将捕获从最后一个/到 的所有内容,在最后一个斜杠后.phtml添加mydirectory/,写回我们捕获的文本,然后添加.php扩展名。