Почему Сед делать больше, что я спросил?

Когда я применил sed -i -e "s/..\///" -e "s/type_properties\///" testfile к следующему файлу:

 #include "../../../../include/concepts/type_properties/operations/has_or_op_v.hpp" int main() { // Test has_not_op_v. } 

Это выводит это:

 #include "../../../include/concepts/operations/has_or_op_v.hpp" int main() { / Test has_not_op_v. } 

Я просто хотел, чтобы sed удалил один ../ и удалил type_properties/ , но это также испортило мою аннотацию.

2 Solutions collect form web for “Почему Сед делать больше, что я спросил?”

Персонаж . это метасимвол Это означает, что оно имеет особое значение. . означает «соответствовать любой отдельной букве или символу». Вы хотите соответствовать только буквальному . персонажи.

Если вы измените . к \. , вы получите правильный вывод.

Пример:

 sed -i -e "s/..\///" -e "s/type_properties\///" testfile 

будет выглядеть так:

 sed -i -e "s/\.\.\///" -e "s/type_properties\///" testfile 

Прежде всего, не используйте sed -i при тестировании. Запустите сначала без -i и проверьте результат. Если вы знаете, что все выглядит правильно, добавьте -i чтобы зафиксировать изменение в файле на месте.

Кажется, причина в sed больше, чем в том, что его просят, в том, что комментарий в функции main() соответствует первому из двух ваших выражений, ..\/ (два символа и косая черта).

Если вы знаете, что хотите применить только изменения к строкам, начинающимся с #include , вы можете использовать

 sed -e '/^#include/{s%\.\./%%; s%type_properties/%%;}' file.c 

Здесь две замены выполняются только в строках, начинающихся со строки #include . Я также правильно экранировал две точки в первом выражении, чтобы они соответствовали точкам, а не «любому символу». Поскольку текст, который мы сопоставляем, содержит косую черту, я также выбрал использование альтернативного разделителя % в командах s .

  • Использование команд оболочки для манипулирования файловыми путями для использования в качестве аргументов для другой программы
  • Согласование нескольких шаблонов на одной строке
  • pcregrep не работает из-за ошибки сегментации
  • Есть ли альтернатива команде «sed -i» в Solaris?
  • Как удалить повторяющиеся буквы с помощью sed?
  • Распечатайте n строк до match1 И строки после match1 до match2
  • bash для переменной цикла, не меняющейся
  • Найдите шаблон и вставьте # в начале 2 строки до этого и 1 строку после этого
  • Есть ли утверждения о нулевой ширине в sed?
  • Получить серийный номер из Показать инвентарь
  • AWK Поиск массивного файла и запись в имя переменной
  • Interesting Posts

    Значение bash $ LINE не отображается, если определено как val = `$ LINE`

    Как убедиться, что переменная $ var расширена в «$ varsomething»?

    Установите мета-ключ диспетчера окон в зависимости от подключенного Xserver

    packet_write_wait Разбитая труба, даже выходящая сверху?

    Перенаправление в файл не работает должным образом

    Как grep файл bz2, который находится далее в папке с zip-файлом

    Убить процесс, выполняющийся на порту 80

    Xargs с несколькими записями аргументов – используйте аргумент переменной окружения после sh -c '…'

    Какова максимальная память, которую может потреблять 64-битный процесс?

    Как выполнять очистку имен файлов, содержащих недопустимые символы

    Найти крупнейшие файлы определенного владельца

    Откройте текстовый файл и пусть он обновит себя

    Unix: проблема с командой cmp

    Возможно ли получить оригинальное (лучшее) качество звука при использовании avconv?

    Получение имен групп для списка пользователей

    Linux и Unix - лучшая ОС в мире.