Вопрос

я использую СЭД для замены текста в файлах.Я хочу передать 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.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top