2013-05-21 2 views
0

У меня есть большое количество файлов, и я хочу заменить некоторые строки из всех этих файлов. Я не знаю точное содержание строк, все, что я знаю, все они содержат два известных слова - скажем, например, «Программист» и «Боб». Таким образом, строки, которые я хочу, чтобы заменить может быть что-то вроде:Замена строки из нескольких файлов, ограничивающих диапазон номеров строк

Created by Programmer Bob 
Programmer extraordinaire Bob, such an awesome guy 
Copyright programmer bob, all rights reserved 

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

До сих пор я пытался:

find . -exec grep -il -E 'Programmer.*Bob' {} \; | xargs sed -i '1,10 /Programmer.*Bob/Ic\LINE REPLACED' 

(я использую находку, потому что Grep столкнулся с бесконечной рекурсии - Я думаю, что не точка здесь.).

Однако, кажется, что я могу 'используйте диапазоны адресов с помощью c \ (строка изменения). Не стесняйтесь указывать на какие-либо синтаксические ошибки, но я думаю, что я пробовал все безрезультатно. Это работает без номеров строк.

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

Позже я понял, что хочу сохранить возможные пробелы и прокомментировать символы в начале строки. Я выполнил это с помощью этой команды:

find . -exec grep -ilI '.*Programmer.*Bob.*' {} \; xargs sed -i -r '1,10 s/([ \t#*]*)(.*Programmer.*Bob.*)/\1LINE REPLACED/I' 

\ 1 хранит шаблон, соответствующий [\ t # *] *. Можно было бы изменить это^[\ т # *] *, что бы привязать шаблон к началу строки, но (я думаю), это текущая версия изменится

** Text I don't want to remove ** Programmer Bob 

в

** Text I don't want to remove ** LINE REPLACED 

Что на самом деле может быть лучше. (Я также добавил флаг -I (капитал i) команде find, которая пропускает двоичные файлы.)

ответ

0

Вы смешиваете адреса и команды. Простая замена должна работать:

find . -exec grep -il -E 'Programmer.*Bob' {} \; \ 
    | xargs sed -i '1,10 s/.*Programmer.*Bob.*/LINE REPLACED/' 
+0

Должно быть, я был с ужасным туннельным зрением, потому что этот ответ, кажется, имеет смысл, но по какой-то причине, я просто не мог» t понять это. Может, мне нужно отдохнуть. :) Я попробую и отметю как правильно, если это сработает. Благодаря! –

0
find . -type f -name "*.cpp"|xargs perl -pi -e 'if(/Programmer/ && /Bob/ && $.>=1 && $.<10){$_="line to replace"}' 
0

СЕПГА Команда:

>sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file 
Смежные вопросы