Одиночная команда sed для множественных замен? - PullRequest
2 голосов
/ 05 октября 2009

Я использую sed для замены текста в файлах. Я хочу дать sed файл, который содержит все строки, которые нужно найти и заменить в данном файле.

Перебирает файлы .h и .cpp. В каждом файле он ищет имена файлов, которые включены в него. Если он найден, он заменяет, например, «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.

Ответы [ 3 ]

5 голосов
/ 06 октября 2009

Вы можете исключить один из циклов, поэтому 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"\>"/

(В статье Общие темы: Sed by example, Part 3 есть много примеров сценариев sed с объяснениями.)

Не запутаться (каламбур).

4 голосов
/ 05 октября 2009

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
0 голосов
/ 06 октября 2009

Что бы я сделал, изменил allFilesWithH.txt на команду sed с помощью sed.

(При необходимости использовать sed. Я бы вместо этого использовал Perl, он также может выполнять поиск файлов * .h.)

...