我有一个很大的文本文件 - 一个 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
可以看到文字表达式。