grep|sed| -edit -delete

Как прикрутить sed к grep?
Какие будут варианты?
Допустим, хочу найти слово "root" во всех файлах /usr/*/*/*... и заменить его на "----"
1. регистро не зависимо
2. в бинарных "эльфах"
Какие могут там быть грабли, например встреча с "не файлом", типа /dev/fd0 что-нибудь, как это профильтровать тогда? Что ещё может быть? Линки-крослинки...точки, недопустимые символы и т.п.,
как это зделать покоректнее?

Но хак должен быть безкомпромисным, патчить всё напрополую что только возможно... :)

Можно в несколько проходов, если в одну комманду трудно впихнуть, так даже лучше,
потому что например, редактирование скажем только цифр уже само по себе не регистрово.

grep -i -n posix /usr/* |xargs grep -i -e "s/posix/linux/gi" {} \; как то так чтоль?

а что никто грепом не умеет

а что никто грепом не умеет пользоваться? :)
или все гуру и лень поэтому отвечать...

semiono написал(а):Какие

semiono написал(а):
Какие могут там быть грабли, например встреча с "не файлом", типа /dev/fd0 что-нибудь, как это профильтровать тогда?

Скрутить sed с find'ом. Зачем здесь grep, ума не приложу.

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

find ищет в именах, а мне

find ищет в именах, а мне надо внутри файлов.
Вот человек подсказал -
grep -r -i -l xxzz * | xargs sed -i -e 's/xxzz/zzxx/gi'
а файндом я так пользуюсь -
find /mnt/ax/usr -iname *tmp* -t file -exec rm -rv {} \;
вроде так ещё говорят "*tmp*" и "{}" хотя не вижу разницы?
а для сед я думаю может так коректнее - "s/xxzz/zzxx/gi" ?
вобщем первые шаги делаю :)
но мну интересуют регэкспы и всё такое....

кстати, можно ли так указывать ls -la /usr/*/*/* или достаточно один раз /*
помоему иногда глубина директорий игнрируется... или мне показалось

Спасибо, забрал строку с

Спасибо, забрал строку с грепом. [-:
По поводу файда

# find lol/ -iname "lol*" -type d
lol/
lol/lol lol
lol/lol1

и без

# find lol/ -iname lol* -type d
lol/

По поводу ls, не проще ли использовать -R?

gfs

semiono написал(а):
find ищет в именах, а мне надо внутри файлов.

См. предыдущий комментарий.

Цитата:
grep -r -i -l xxzz * | xargs sed -i -e 's/xxzz/zzxx/gi'

"Найти все файлы, в которых есть строка xxzz и заменить её на zzxx" = "Заменить во всех файлах строку xxzz на zzxx"

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

grep|sed| -edit -delete

krigstask написал(а):
= "Заменить во всех файлах строку xxzz на zzxx"

предлагаете сразу сэдом? только при этом хотелось бы -verbose как нибудь...
Чтоб видеть что чего.

Что например?

Что например?

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

Посмею предположить: файлы, в

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

само-собой верно! неплохо б

само-собой верно! неплохо б ещё что job.log создавался, так как в экран может не влезть иногда.

semiono написал(а):Как

semiono написал(а):
Как прикрутить sed к grep?
Какие могут там быть грабли, например встреча с "не файлом", типа /dev/fd0 что-нибудь, как это профильтровать тогда? Что ещё может быть? Линки-крослинки...точки, недопустимые символы и т.п.,
как это зделать покоректнее?

Если всё же будете использовать grep:
grep --devices=skip --binary-files=text -Z -R -l PATTERN [FILE...]
Пропустит файлы устройств, бинарные будет просматривать как текст, а -Z уберёт ":" после имени файла. Всё из мана.

thnx! :)

спасибище! :)
вопрос: если бинарные читать как текст, наверное возникает вопрос о кодировке, хотя ясно - то что задал в баш то и будет патерн?
впрочем, а как в бинарном виде "пропадчедь" сеэдом? например, если задавать буквально байты кода
a0 b0 f0 1e... типа? или эти утилиты так не могут? ...То-есть добавим работу Hex-редактора без самого редактора :)

PS тут обсуждаем всё кроме perl =) потому-что он не "нативный", тока простые гну - grep sed... ?

Не знаю точно, но думаю будет

Не знаю точно, но думаю будет использоваться ASCII кодировка. С опцией --binary-files=text лучше не шутить и внимательно следить за stdout(1>) и лучше его перенапрявлять(куда и так ясно), потому что этот бинарный мусор терминал может воспринять как команды, а лучше запускать grep в silent режиме или с опцией -о или -l - много вариантов, но этот мусор в терминал не пускать.
По поводу sed'а не скажу, ибо пока сам про него почти ничего не знаю =).

а как вообще байты

а как вообще байты "регекспами" задавать? вроде слешами как-то \01 \07 или как?

--binary-files="01010101" :) ??

offtop: какие редакторы бывают кроме vi, nano, и кроме ужасного навороченного emacs !
есть ли чтонить простое и аскетичное, как альтернатива для nano ?
или же как нано нарулить - изменить цвет, зделать нумерацию строк и убрать это меню что внизу торчит?
может доки есть от юзеров и советы?

eix hexedit Емаск не ужасно

eix hexedit

Емаск не ужасно наворочен. Он прекрасно наворочен :) Хекседит не юзал лет сто, потому ничего о нем сказать не могу в плане использования из скрипта. Затейка поменять во ВСЕХ файлах одно значение на другое оптом ни к чему хорошему не приведет. Из потоковых редакторов еще есть awk,весьма достойная штука, несколько медленнее седа. Использование грепа ИМХО в вашей задаче лишнее. Таким макаром вам придется парсить ВСЕ файлы дважды. Один раз для составления списка, второй раз таки для правки. Менее накладно будет получить список, подлежащий обработке, независимо от содержания (это таки пресловутые ls && find), затем произвести обработку по списку. Перл сходу отвергать не стоит. Все-таки поддержка хешей, карт и т.п зачастую работает на порядок эффективней еквилибров с седом,авком и шеллом.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".