Рекурсивный многострочный sed - удаление начала файла до совпадения с образцом - PullRequest
1 голос
/ 08 июня 2010

У меня есть вложенные подкаталоги, содержащие HTML-файлы. Для каждого из этих HTML-файлов я хочу удалить из верхней части файла до шаблона <div id="left- Это моя попытка с терминала OSX:

find . -name "*.html" -exec sed "s/.*?<div id=\"left-col/<div id=\"left-col/g" '{}' \;

Я получаю много выводов html в termainal, но ни один файл не содержит подстановку или записан.

Ответы [ 3 ]

4 голосов
/ 08 июня 2010

Есть две проблемы с вашей командой.Первая проблема заключается в том, что вы не выбираете выходное местоположение для sed.Во-вторых, ваш sed скрипт не выполняет то, что вы хотите: скрипт, который вы разместили, будет смотреть на каждую строку и удалять все на этой строке до <div>.Линии без <div> не будут затронуты.Вы можете попробовать:

find . -name "*.html" -exec sed -i.BAK -n "/<div id=\"left-col/,$ p" {} \;

Это также автоматически создаст резервную копию ваших файлов, добавив .BAK к исходным версиям.Если это нежелательно, измените -i.BAK на просто -i.

1 голос
/ 08 июня 2010

Вы выводите результат регулярного выражения sed на консоль stdout, когда хотите записать его в файл.

Чтобы выполнить поиск и заменить на sed, используйте-i flag:

find . -name "*.html" -exec sed -i "s/.*?<div id=\"left-col/<div id=\"left-col/g" '{}' \;

Убедитесь, что вы сделали резервную копию своих файлов перед выполнением этой команды, если это возможно.В противном случае вы рискуете потерять данные из-за неправильного выражения.

0 голосов
/ 08 июня 2010

Вы не храните вывод sed в любом месте;вот почему он выплевывает HTML.

...