поиск и замена слов ->

Форум предназначен для новичков. В нем предполагается рассматривать вопросы, которые встают на первых этапах освоения Linux
Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

поиск и замена слов ->

Сообщение Semiono »

Нужна помощь видимо по grep, cut и т.п.
Пожалуйста не заставляйте ман перечитывать, потомучто нужно выполнить это надёжно жёстко и безкомпромисно.
Может там окажутся камни ещё какие подводные, кто ж знает...

Задача: (под рутом)
Найти и заменить во_всех_файлах во всём корне '/' все слова, напр. 'firefox'
Что можно зделать чтобы найти это в возможных разных ACSII / UTF~ кодировках, либо case sensitive? Какими ключами это задать?
Задача2
Как найти имя-файла я примерно знаю, хотя возможно бывают и другие варианты?
find / -name firefox
Но как найти и сразу заменить все_имена_файлов_firefox на любое другое?
Кстати, я не знаю как просто найти набор символов в имени, так как моя команда помоему только целиком ищет заданное имя.
Вообщем нужны комманды, только очень надёжные и верные алгоритмы от опытных гуру!
:)
windows is not unix ;

leave
Неотъемлемая часть форума
Сообщения: 1055
Зарегистрирован: 25 окт 2006, 14:50
Откуда: minsk
Контактная информация:

Сообщение leave »

замена подстроки во всех txt файлах в текущем каталоге:
$ sed -i -e 's/что/на_что/' *.txt
регистрозависимость по умолчанию присутствует

найти и заменить:
find...|xargs

"набор символов" легко примитивным регвыром определяется:
find . -name log[1,2]

а маны по sed, grep, awk все-таки покури - весьма полезно

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение Berserker »

Код: Выделить всё

find . -name '*firefox*' -exec echo mv -v  \'{}\'  \"\`echo \'{}\'\|sed s@firefox@foxfire@g\`\"  \; | sh
заменіць firefox на foxfire у назвах файлаў, пачынаючы з бягучага каталога.

Код: Выделить всё

grep -rl firefox . | sed 's@^@sed -i "s/firefox/foxfire/g" "@; s@$@"@' |sh
заменіць firefox->foxfire у змесце файлаў, пачынаючы з бягучага каталога.

leave
Неотъемлемая часть форума
Сообщения: 1055
Зарегистрирован: 25 окт 2006, 14:50
Откуда: minsk
Контактная информация:

Сообщение leave »

-exec echo
|xargs echo

с целью повышения производительности.

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

Некоторые вещи в "обычных" эдиторах решаются естественно, поэтому даже не приходится задумываться - просто жмёшь shift
и двигаешь кусрсор, или ещё проще выделяшь мышью.


Поэтому я напишу вопрос по вим, чтоб было понятно что:

1. Как выделить текст начиная со второго символа второй строки и завершив вторым символом десятой строки?

1.a ( ! не знаю имеет ли поддержку vi сразу помещать выделенный текст в буфер обмена, кстати unix-way, но было бы так ещё удобней? )

2. Задача по-сложней, выделить текст так, как будто мы держим клавишу Ctrl, а выделяем мышью куски текста между которыми оставляем промежутки?
windows is not unix ;

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

Berserker, что есть | sh
может быть bash? и вообще это зачем?

ну и если возможно объяснить такое
s@^@sed
@ - ? :)
видимо что-то из regular expressions...
как мну выяснил, что sed -i не всегда тоже имело поддержку!...

-----------------
Как правильно указывать это /* :)
почему когда я набираю
# pwd
/root
# sed -i /s/aaa/bbb/g /*
не работает, или это потому что sd не работает с подкаталогами и типа надо совместно с find только запускать?
Иль всёж /* это вообще не правильно? Я имею ввиду как в ms-dos C:\*.* :)
Какая маска самая жадная?
windows is not unix ;

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Сообщение grub »

1. Как выделить текст начиная со второго символа второй строки и завершив вторым символом десятой строки?

Ctrl+V
включается visual режим и можешь дальше навигировать, ничего не зажимая. Повторная комбинация вроде как останавливает этот режим не снимая выделения с текста (точно не помню, возможно и по esc выход из режима)

1.a ( ! не знаю имеет ли поддержку vi сразу помещать выделенный текст в буфер обмена, кстати unix-way, но было бы так ещё удобней? )

:y
:yank

копирует в буфер выделенный текст

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

Ctrl+V это наверное под dm, в консоли что-то не хочет.
Зато Shift+PgUp экран крутит, я раньше и не знал! Ух!
А less /etc/inittab смотрелка хорошая... а я раньше всё через vi читал :shock:
лесс только через | less юзал :D
вот такие мы совсем ниграмотные
windows is not unix ;

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение Berserker »

Berserker, что есть | sh
может быть bash? и вообще это зачем?
|sh
|bash
означает передать текст программе, в данном случае интерпретатору. Пример :
echo ls | bash
ну и если возможно объяснить такое
s@^@sed
@ - ? :)
видимо что-то из regular expressions...
почему-то лично мне удобно использовать для отделения MATCH , PATTERN и FLAGS символы @, а не стандартные /. Как-то оно красивее.
как мну выяснил, что sed -i не всегда тоже имело поддержку!...
Ты прав, sed-ы отличаются от ОС к ОС. Но ключ -i является обязательным для всех (правка файла inline).

Как правильно указывать это /* :)
почему когда я набираю
# pwd
/root
# sed -i /s/aaa/bbb/g /*
что это? может,
sed -i s/aaa/bbb/g /*
?
Я имею ввиду как в ms-dos C:\*.* :)Какая маска самая жадная?
т.к.в линуксе нет расширений, то это просто *

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

почему-то лично мне удобно использовать для отделения MATCH , PATTERN и FLAGS символы @, а не стандартные /. Как-то оно красивее.
значится сепараторы! угу, красивее!
Я прочитал что можно вообще любые использовать, однако если вдруг
разделить буквами этож наверное не сработает... наверное какие-то
критерии есть тоже...
Это похоже так же на приминение "pattern" и 'pattern' я тут опять же наугад шпарю обычно :) ?
что это? может, sed -i s/aaa/bbb/g /* ?
Ой ошибочка! Да!
т.к.в линуксе нет расширений, то это просто *
Но это только файлы, а файлы в каталоге?
Наверное всётаки это есть правильно -
в корне /* или в другом каталоге /usr/bin/*

Кстати, такое вроде тоже срабатывало /test/*/*/* это когда я ещё ключа -R не знал... ( rm -Rv /test ) :)
windows is not unix ;

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

Регулярное выражение.

- Регулярное выражение указывается в разделителях: "/ /".

- Любой символ (кроме специальных: \[.^*$) является регулярным выражением себя.

- Символ ^ в начале регулярного выражения указывает на пустой символ в начале регулярного выражения. (Т.е. на начало строки).

- Символ $ в конце регулярного выражения указывает на пустой символ в конце регулярного выражения. (Т.е. на конец строки).

- Символ \n обозначает новую строку (newline).

- Символ - обозначает любой символ (кроме обыкновенного newline );

- Символ *, стоящий за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 0.

- Выражение [ ] указывает на один из символов, приведенных внутри.

- Выражение [^ ] указывает на один из символов, кроме приведенных внутри.

- Символ \ перед любым символом, кроме цифр и "(" , ")" , означает этот символ. (Экранирование специальных символов).

- Выражение \(x\), где x - регулярное выражение, указывает на x.

- Символы \d, где d - цифра, указывает копию d-того выражения, которое заключалось в скобки "\(" и "\)"

- Конкатенация регулярных выражений является регулярным выражением.


типа памятка по sed...
windows is not unix ;

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

заменіць firefox->foxfire у змесце файлаў, пачынаючы з бягучага каталога.
здаётся мне что grep так же как и sed не работает с подкаталогами :?

вот моя конструкция:

Код: Выделить всё

# cd /mnt
# ls -la */*/*/*
... blah blah :)
# find -P ./ -name '*' | xargs grep -il 'NaME'
однако я не смог довести это до ума:

Код: Выделить всё

# find -P ./ -name '*' | xargs grep -il 'NaME' | xargs sed -i s/NAMe/makE/g {}
но что не так?
windows is not unix ;

Аватара пользователя
cympak
Увлекающийся
Сообщения: 114
Зарегистрирован: 26 окт 2005, 13:38

Сообщение cympak »

Semiono писал(а): здаётся мне что grep так же как и sed не работает с подкаталогами :?
man grep:

-R, -r, --recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.
...а на каком основании ограниченность некоторых делать законом для всех?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Аватара пользователя
Semiono
Увлекающийся
Сообщения: 114
Зарегистрирован: 27 янв 2006, 09:19
Откуда: GmbH
Контактная информация:

Сообщение Semiono »

Код: Выделить всё

find . -iname "*" -exec sed -i -e "s/Jj/jJ/gi" "{}" \;
:) (-iname не обязательно конечно)
windows is not unix ;

Ответить