Linux 从bash脚本替换文件中的字符串

Linux 从bash脚本替换文件中的字符串,linux,bash,shell,scripting,ssh,Linux,Bash,Shell,Scripting,Ssh,我需要在一个小bash脚本中替换一个文件中的字符串,但是。。。我得到了奇怪的结果 假设我想替换: <tag><![CDATA[text]]></tag> 与: 我应该使用sed?我想由于/和[]我得到了奇怪的结果 解决这个问题的最佳方法是什么?是的,您需要转义括号,或者转义斜杠,或者使用不同的分隔符 sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[C

我需要在一个小bash脚本中替换一个文件中的字符串,但是。。。我得到了奇怪的结果

假设我想替换:

<tag><![CDATA[text]]></tag>

与:


我应该使用
sed
?我想由于
/
[
]
我得到了奇怪的结果


解决这个问题的最佳方法是什么?

是的,您需要转义括号,或者转义斜杠,或者使用不同的分隔符

sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[CDATA\[replaced)text\]\]></tag>,'
sed's,,'

也就是说,SGML和XML实际上并不比使用正则表达式更好;不要期望这是泛化的。

是的,您需要转义括号,或者转义斜杠,或者使用不同的分隔符

sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[CDATA\[replaced)text\]\]></tag>,'
sed's,,'

也就是说,SGML和XML实际上并不比使用正则表达式更好;不要期望这是泛化的。

Perl with-p选项的工作原理几乎与sed一样,并且它的正则表达式有\Q(引号)开关:

perl -pe 's{\Q<tag><![CDATA[text]]></tag>}
           {<tag><![CDATA[replaced_text]]></tag>}' YOUR_FILE
perl-pe的{\Q}
{}您的_文件

在Perl中,您可以使用不同的标点符号来分隔表达式(在我的示例中为s{…}{…})。

Perl with-p选项的工作方式几乎与sed相同,并且它的正则表达式有\Q(引号)开关:

perl -pe 's{\Q<tag><![CDATA[text]]></tag>}
           {<tag><![CDATA[replaced_text]]></tag>}' YOUR_FILE
perl-pe的{\Q}
{}您的_文件
在Perl中,您可以使用不同的标点符号来分隔表达式(在我的示例中是{…}{…})。

这就足够了:

$ echo '<tag><![CDATA[text]]></tag>' | sed 's/\[text\]/\[replaced_text\]/'
<tag><![CDATA[replaced_text]]></tag>
$echo'\124; sed's/\[text\]/\[replaced\u text\]/'

您还可以将sed中的
/
分隔符更改为不同的字符,如
|
%
这就足够了:

$ echo '<tag><![CDATA[text]]></tag>' | sed 's/\[text\]/\[replaced_text\]/'
<tag><![CDATA[replaced_text]]></tag>
$echo'\124; sed's/\[text\]/\[replaced\u text\]/'


您还可以将sed中的
/
分隔符更改为不同的字符,如
%
只需使用除/(此处我使用#)以外的分隔符即可:


切换到perl,因为sed不支持非贪婪乘法器(即*?)。

只需使用除/(这里我使用#)以外的分隔符即可:


切换到perl,因为sed不支持非贪婪乘法器(即*?)。

+1表示文字字符串。如果任何人都有一个链接,指向如何转义原始文本或替换文本,以避免嵌入
\E
或其他特殊序列的话,这将更加出色。+1表示文字字符串。如果任何人都有一个链接,指向如何转义原始文本或替换文本,以避免嵌入
\E
或其他特殊序列,那么这将更加出色。