This question already has an answer here:
Closed 3 years ago.
Sed regex change of file
(1个答案)
我知道我可以和塞德一起做。但在我的具体任务中,这有点复杂。所以尽管这个网站上有很多例子,我还是搞不清楚。
我有一个带凭据的配置文件。
<username><![CDATA[prefix_cms]]></username>
<password><![CDATA[complexpwd]]></password>
<dbname><![CDATA[prefix_cms]]></dbname>

我要将所有凭据更改为新的唯一值。当我使用find an replace with SED时,这是一个问题,因为它将用户名和dbname更改为新值。
例如,新值应为:
newusername
newpassword
newdbname

我该怎么做?我已经在SED中寻找了第一个事件,但由于某种原因无法使它工作。
我还尝试查找和替换整行内容,包括XML和CDATA protion,但由于使用了特殊字符,这使得它更加复杂。
我该怎么解决?
编辑:
我正在寻找的输出。
<username><![CDATA[newusername]]></username>
<password><![CDATA[newpassword]]></password>
<dbname><![CDATA[newdbname]]></dbname>

在寻找第一个答案时,我发现我对自己想要的东西还不是很清楚。
编辑2:
我在这里找到了一个完美的解决方案:Sed regex change of file

最佳答案

做:

sed -E 's/username|password|dbname/new&/g' file

username|password|dbname匹配任何usernamepassworddbname
在替换中,new在每次匹配(&)之前是独立的,并且在一行(g)中的所有匹配项上都是独立的
例子:
% cat file.txt
<username><![CDATA[prefix_cms]]></username>
<password><![CDATA[complexpwd]]></password>
<dbname><![CDATA[prefix_cms]]></dbname>

% sed -E 's/username|password|dbname/new&/g' file.txt
<newusername><![CDATA[prefix_cms]]></newusername>
<newpassword><![CDATA[complexpwd]]></newpassword>
<newdbname><![CDATA[prefix_cms]]></newdbname>

编辑问题的答案:
sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file

例子:
% cat file.txt
<username><![CDATA[prefix_cms]]></username>
<password><![CDATA[complexpwd]]></password>
<dbname><![CDATA[prefix_cms]]></dbname>

% sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file.txt
<username><![CDATA[newusername]]></username>
<password><![CDATA[newpassword]]></password>
<dbname><![CDATA[newdbname]]></dbname>

关于linux - 在bash脚本中查找并用SED替换字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39958452/

10-09 08:25
查看更多