我正在使用 GNU SED 对大文件(最大 2GB)进行查找和替换功能。
查找和替换字符可以包含任何字符,因此我希望查找和替换参数被视为纯文本。
我不想通过 sed 命令将查找或替换参数视为正则表达式。
我进行了很多实验,但每次我都会得到新的正则表达式组合,而这些组合对于 sed 作为纯文本不起作用。
如何实现这一点?
是否有任何公式可以转义特殊字符?
注意:我使用~
运算符作为命令分隔符,而不是/
下面是例子
sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"
上述命令不起作用,因为它将 find 参数视为正则表达式(因为它是正则表达式)。因此,为了找到文本,我必须转义正则表达式中的一些特殊字符,如下所示
sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"
在另一个例子中,我必须修改.*$
但.\*\$
我(.*$)
不想修改输入。
那么转义序列是否存在通用规则?
答案1
问:是否有任何公式可以转义特殊字符?
问:转义序列是否有任何通用规则?
A:如果单纯输入/
、.
、*
、?
、$
等会让人觉得厌烦,您可以使用特殊字符的相应十六进制代码。例如:
sed -rn '/\x22/p' file
将打印包含双引号的行,因为\x22
代表"
。
如果您需要查找十六进制代码,您可以方便地使用以下命令将它们全部保存到文件中:
gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt