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)
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
扩展名。