2016-10-10 123 views
0

我知道我可以用SED做到这一点。但在我的具体任务中,它有点复杂。所以尽管本网站有很多例子,但我仍无法弄清楚。用SED查找并替换bash脚本中的字符串

我有一个配置文件与凭据。

<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

我想将所有凭据更改为新的唯一值。当我使用SED替换时,这是一个问题,因为它将用户名和数据库名更改为新值。

新的值应该是,例如:

newusername 
newpassword 
newdbname 

我会怎么做呢?我曾在SED中寻找过第一次出现,但由于某种原因无法工作。

我也试图找到并替换整个行,包括XML和CDATA区,但这使得它更复杂,因为特殊字符。

我该如何解决这个问题?

编辑

输出我所期待的。

<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 

寻找我看到的第一个答案我没有很清楚我想要什么。

EDIT2

我发现这里的完美解决方案:Sed regex change of file

+0

为什么-1?反馈? – Akif

+0

为了清晰起见,您可以发布完整的预期输出吗?没有任何重叠提出任何问题,所以加入你的尝试,以便你可以知道你错了什么地方......而且我也没有倒下...... – Sundeep

+1

我没有投票,但想知道预期的产出或投入的努力在哪里? –

回答

1

务必:任何

sed -E 's/username|password|dbname/new&/g' file 
  • username|password|dbname比赛usernamepassworddbname

  • 在更换,new在每个匹配(&)之前perpended,并且在比赛中出现的所有的线(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> 
+0

谢谢,我看到我并没有完全清楚自己想要什么,于是我编辑了预期输出的问题。 – Akif

+0

@Akif检查我的编辑。 – heemayl