![如何在 bash/sed 中替换该值](https://linux22.com/image/34402/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%2Fsed%20%E4%B8%AD%E6%9B%BF%E6%8D%A2%E8%AF%A5%E5%80%BC.png)
在我的文件中包含以下文本
http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
我需要这个(我想我需要使用 sed?)
http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
答案1
sed 's/\([^/]*\)\.phtml$/mydirectory\/\1.php/' <filename>
如果您需要的话,我会这样做。 (可选地使用-i
标志进行就地替换。)
为了打破它,首先我们有
s/<regexp>/<replacement>/
这将替换<regexp>
与 匹配的内容<replacement>
。接下来让我们看看我们的正则表达式:
\([^/]*\)\.phtml$
首先,在最后我们\.phtml$
将查找.phtml
行尾的字符串。$
将正则表达式锚定到行尾,并且点前面有一个反斜杠来转义它,因为通常点匹配任何内容。
之后我们剩下的是:
\([^/]*\)
查看中间,我们[^/]
将匹配一个字符([]
将匹配方括号内的字符之一),该字符可以是不是斜杠的任何字符,因为^
将进行否定匹配,因此^/
在方括号内“除斜线”。右方括号后面有一个星号 ,*
这意味着它将匹配方括号内的一个或多个字符。
然后将上面的内容包裹起来\(
,\)
它将捕获括号内匹配的内容,并让您在<replacement>
部分中使用它们s/<regexp>/<replacement>/
,以便我们可以使用它们。
然后在本<replacement>
节中我们有:
mydirectory\/\1.php/
它将用first替换匹配的rexecp ,因为用作sed替换的分隔符,mydirectory/
所以需要替换斜杠,然后用于放入第一个捕获组中捕获的文本,然后我们添加扩展名在最后。/
\1
.php
所有这些加在一起意味着我们将捕获从最后一个/
到 的所有内容.phtml
,在最后一个斜杠之后添加mydirectory/
,写回我们捕获的文本,然后添加.php
扩展名。
答案2
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
moi@laptop:/home/moi/tmp >sed -i 's/\/\([^\/]\+\)\.phtml/\/mydirectory\/\1.php/g' in.txt
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
moi@laptop:/home/moi/tmp >