使用 sed 将特定字符串替换为斜杠

使用 sed 将特定字符串替换为斜杠

我有一个很大的文本文件 - 一个 Windows 注册表文件 - 大约 5.5MB,我必须删除字符串“serv\b\Param\”。使用 gedit 或 nano 打开不起作用。它要么会消耗 100% 的 CPU 时间,持续很长时间,要么只会打印随机的文本垃圾。我尝试在 Linux 中使用这些命令,因为我不能使用另一个命令:

sed -i 's|"serv\b\Param"|""|g' ~/Desktop/3.reg

sed -i 's|\"serv\b\Param"|\""|g' ~/Desktop/3.reg

sed -i 's:serv\b\Param:"":g' ~/Desktop/3.reg

sed -i 's:serv\b\Param::g' ~/Desktop/3.reg

sed -i 's:"serv\b\Param":"":g' ~/Desktop/3.reg

到目前为止什么都没起作用。这些命令有什么问题?

答案1

斜线需要转义:

sed -i 's|serv\\b\\Param\\||g' ~/Desktop/3.reg

在 中sed,单个反斜杠通常是某个符号的转义字符。例如,在 GNU 中sed,转义符 b(如\b)被解释为单词边界。为了避免这种解释,请在要匹配单个文字反斜杠的位置连续放置两个反斜杠。

例子

根据您的示例(根据评论更新),让我们从此文件开始:

$ cat 3.reg
serv\b\Param\
abc serv\b\Param\ def

应用上述sed命令:

$ sed -i 's|serv\\b\\Param\\||g' 3.reg
$ cat 3.reg

abc  def

图案已成功移除。

答案2

基本问题是\在正则表达式中引入各种序列,因此要\在输入流中进行匹配,需要\\在 RE 中使用。

目前尚不清楚引号是否是您要删除的字符串的一部分:从您的第四个示例来看,我假设不是,在这种情况下,如果您将反斜杠加倍,此示例就会有效:

sed -i 's:serv\\b\\Param::g' ~/Desktop/3.reg

您不需要在搜索或替换字符串中使用双引号,除非它们构成搜索条件的一部分:就 shell 而言,编辑表达式周围的单引号已经删除了任何特殊含义,因此sed可以看到文字表达式。

相关内容