Одна команда sed для нескольких замен?
-
19-09-2019 - |
Вопрос
я использую СЭД для замены текста в файлах.Я хочу передать sed файл, содержащий все строки, которые нужно найти и заменить в данном файле.
Он работает с файлами .h и .cpp.В каждом файле он ищет имена файлов, которые включены в него.Если он найден, он заменяет, например, «a.h» на «<a.h>» (без кавычек).
Скрипт такой:
For /F %%y in (all.txt) do
for /F %%x in (allFilesWithH.txt) do
sed -i s/\"%%x\"/"\<"%%x"\>"/ %%y
- all.txt — Список файлов для замены в них
- allFilesWithH.txt — все включенные имена для поиска.
Я не хочу запускать sed несколько раз (по количеству имен файлов в input.txt), но я хочу запустить одну команду sed и передать ее input.txt в качестве входных данных.
Как мне это сделать?
P.S. Я запускаю sed из оболочки VxWorks Development, поэтому в ней нет всех команд, которые есть в версии для Linux.
Решение
sed
сам по себе не имеет возможности читать имена файлов из файла.Я не знаком с оболочкой VxWorks и полагаю, что это как-то связано с отсутствием ответов...Итак, вот некоторые вещи, которые будут работать в bash — возможно, VxWorks будет поддерживать одну из этих вещей.
sed -i 's/.../...' `cat all.txt`
sed -i 's/.../...' $(cat all.txt)
cat all.txt | xargs sed -i 's/.../...'
И действительно, нет ничего страшного в том, чтобы вызвать sed
несколько раз, если он выполнит свою работу:
cat all.txt | while read file; do sed -i 's/.../.../' $file; done
for file in $(cat all.txt); do # or `cat all.txt`
sed -i 's/.../.../' $file
done
Другие советы
Вы можете исключить один из циклов, чтобы sed
необходимо вызывать только один раз для каждого файла.Использовать -f
возможность указать более одной замены:
For /F %%y in (all.txt) do
sed -i -f allFilesWithHAsSedScript.sed %%y
allFilesWithHAsSedScript.sed
происходит от allFilesWithH.txt
и будет содержать:
s/\"file1\"/"\<"file1"\>"/
s/\"file2\"/"\<"file2"\>"/
s/\"file3\"/"\<"file3"\>"/
s/\"file4\"/"\<"file4"\>"/
(В статье Общие темы:Сед на примере, Часть 3 есть много примеров sed-скриптов с пояснениями.)
Не запутайтесь (каламбур).
Я бы изменил allFilesWithH.txt на команду sed, используя sed.
(Когда принудительно использовать sed.Вместо этого я бы использовал Perl, он также может выполнять поиск файлов *.h.)