如何在 bash/sed 中替换该值

如何在 bash/sed 中替换该值

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

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 >

相关内容