Linux 从bash脚本替换文件中的字符串
我需要在一个小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
<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
或其他特殊序列,那么这将更加出色。