Я пытаюсь заменить пути в каталоге.
До сих пор я пытался использовать это для каждого файла в каталоге, однако получаю синтаксическую ошибку:
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}
.