1

У меня большой текстовый файл - файл реестра Windows - около 5,5 МБ, и мне нужно удалить строку «serv \b \Param \». Открытие с помощью gedit или nano не работает. Он будет либо потреблять 100% времени процессора в течение некоторого неоправданно длительного времени, либо просто печатать случайный мусор текста. Я попытался использовать эти команды из 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

Пока ничего не работает. Что не так с этими командами?

2 ответа2

0

Косые черты должны быть экранированы:

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

В sed единственная обратная косая черта обычно является для чего-то символом побега. Например, в GNU sed escape-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

Шаблон успешно удален.

0

Основная проблема заключается в том, что \ вводит различные последовательности в регулярные выражения, поэтому для сопоставления \ во входном потоке необходимо использовать \\ в RE.

Не ясно, являются ли кавычки частью строки, которую вы хотите удалить: из вашего четвертого примера я бы предположил, что нет, и в этом случае этот пример работает, если вы удвоите обратную косую черту:

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

Вам не нужны двойные кавычки в строках поиска или замены, если они не являются частью критериев поиска: одинарные кавычки вокруг выражения редактирования уже удаляют любые специальные значения в отношении оболочки, поэтому sed видит буквальное выражение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .