Как заменить строку, которая не содержит другую строку, на `sed`? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь заменить пути в каталоге.

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

sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};

Вот синтаксическая ошибка:

sed: -e expression #1, char 3: unknown command: `u'

Пример ввода:

prop.ppd_search_path = '/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'

Пример вывода:

prop.ppd_search_path = '/usr/local/share;/usr/local/share;/usr/local/lib;/usr/local/lib;/usr/local/libexec;/opt;/usr/local/lib64'

Что я делаю не так?

Строка должна совпадать с /usr, но не должна совпадать с /usr/local, в противном случае выходной путь будет выглядеть как /usr/local/local.Кроме того, замена должна быть прочитана из переменной Ruby, поэтому это может быть /usr/local (по умолчанию) или какой-то совершенно другой путь, например /foo/bar.

Вариант использования:

В каталоге есть тысячи жестко закодированных путей (исходный код HP Linux Printing System), которые указывают путь только для чтения (/usr, в случае Chrome OS).Я пытаюсь заменить все экземпляры /usr на определенный пользователем префикс (по умолчанию /usr/local), игнорируя при этом строку, если она содержит определенный пользователем префикс.Пользовательский префикс находится в скрипте Ruby, и он должен содержаться в переменной Ruby (#{CREW_PREFIX}).Вот что я пытаюсь сделать:

  def self.patch
    # Fix hardcoded file directories
    system "for file in \$(find . -type f); do
              sed -i 's,/etc,#{CREW_PREFIX}&,g' \${file};
              sed -i 's,/usr/share,#{CREW_PREFIX}/share,g' \${file};
              sed -i 's,/usr/include,#{CREW_PREFIX}/include,g' \${file};
              sed -i 's,/usr/lib,#{CREW_LIB_PREFIX},g' \${file};
              sed -i 's,/var,#{CREW_PREFIX}&,g' \${file};
              sed -i 's,/usr/bin,#{CREW_PREFIX}/bin,g' \${file};
              sed -i 's,#{CREW_PREFIX}/bin/env,/usr/bin/env,g' \${file};
              sed -i 's,#{CREW_PREFIX}/etc/os-release,/etc/os-release,g' \${file};
              sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};
            done"
  end

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

sed: -e expression #1, char 3: unknown command: `u'

И я могуне могу найти другой разделитель, который содержит функциональность, которую / выполняет.

Вот с чем я имею дело:

chronos@localhost ~/Downloads/tarballs/hplip-3.19.1 $ grep -R /usr ./*/ > file; du -sh file
40K     file

Мне нужны все эти экземпляры /usr, чтобы статьзначение #{CREW_PREFIX} (переменная), если строка, в которой находится экземпляр /usr, также не соответствует значению #{CREW_PREFIX}.

1 Ответ

0 голосов
/ 12 февраля 2019
$ cat file
./configure --prefix=/usr --enable-foo --disable-bar
./configure --prefix=/usr/local --enable-foo --disable-bar

$ var='/foo/bar'; sed 's:/usr/local:\n:g; s:/usr:'"$var"':; s:\n:/usr/local:g' file
./configure --prefix=/foo/bar --enable-foo --disable-bar
./configure --prefix=/usr/local --enable-foo --disable-bar
...