在linux中搜索和替换复杂字符串

在linux中搜索和替换复杂字符串,linux,ubuntu,sed,Linux,Ubuntu,Sed,在linux启动期间,我需要一些文本搜索替换为最少的工具。Sed不起作用,可能它在我的字符串中发现了一些特殊字符。有没有一种解决方案可以关闭这个奇特的regexp魔法,并用简单的文字搜索替换文件中所有出现的纯文本? 一个我无法工作的例子: sed-i的| | mysvc://{source}| g'my file.xml 我有大约10个其他不同的文本片段,它们可以是长XML、JSON或其他包含各种特殊字符的文本片段。如果命令也可以维护(可读),那就太好了。sed只理解regexp,不理解字符串。

在linux启动期间,我需要一些文本搜索替换为最少的工具。Sed不起作用,可能它在我的字符串中发现了一些特殊字符。有没有一种解决方案可以关闭这个奇特的regexp魔法,并用简单的文字搜索替换文件中所有出现的纯文本? 一个我无法工作的例子:

sed-i的| | mysvc://{source}| g'my file.xml


我有大约10个其他不同的文本片段,它们可以是长XML、JSON或其他包含各种特殊字符的文本片段。如果命令也可以维护(可读),那就太好了。

sed只理解regexp,不理解字符串。试图强迫sed像字符串一样对待regexp是一件痛苦的事情(请参阅),而且通常不值得费心,因为您可以改用awk来理解字符串。e、 g:

awk '
BEGIN {
    old = "<![CDATA[http://example.com/file.json]]>"
    new = "mysvc://{source}"
}
s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
{ print }
' my-file.xml
awk'
开始{
old=“”
new=“mysvc://{source}”
}
s=索引($0,旧){$0=substr($0,1,s-1)新substr($0,s+length(旧))}
{print}
'my-file.xml
显然,上述内容未经测试,因为您没有提供任何可测试的样本输入/输出


如果您需要“就地”编辑,那么如果您有GNU awk使用
awk-i inplace…
并且与其他awk一起使用tmp文件:
awk'…'my-file.xml>tmp和&mv tmp my file.xml

神奇的字符是
[
,使sed认为您正在尝试替换括号表达式。您必须转义
[]
如果您想按字面意思使用它们,或者可能@BenjaminW.comment最有用-转义[和]with\对于我的一小组字符串来说已经足够了。对于那些将其作为dup关闭的人来说-转义方括号不是OPs唯一的问题,他必须转义搜索部分中的所有regexp元字符和替换部分中的所有backreference字符。如果它将作为dup关闭,它将是,但实际上他应该只需使用awk即可。它可能也能工作,但它看起来不如最终对我起作用的东西可读:
sed-i的| | mysvc://{source}|g'my file.xml
并且我的集合中没有其他字符需要修复。我可以将这些命令堆叠起来,结果看起来像脚本一样可读。您错了,sed命令没有执行您认为它正在执行的操作,并且如果不立即执行该方法,稍后将再次攻击您(提示您的集合中有其他regexp元字符)“字符串”,您还没有转义,因此可能会导致错误匹配)。听到您说awk命令的可读性不如sed中的大量字符,我也很惊讶,但我想这是旁观者的看法。如果您喜欢替换语法,您会喜欢perl的答案