不使用正则表达式的 sed

不使用正则表达式的 sed

我正在使用 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

相关内容