Страница 1 из 2

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

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

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

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

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

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

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

Добавлено: 07 мар 2008, 02:02
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 у змесце файлаў, пачынаючы з бягучага каталога.

Добавлено: 07 мар 2008, 11:59
leave
-exec echo
|xargs echo

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

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


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

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

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

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

Добавлено: 21 мар 2008, 23:13
Semiono
Berserker, что есть | sh
может быть bash? и вообще это зачем?

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

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

Добавлено: 22 мар 2008, 01:51
grub
1. Как выделить текст начиная со второго символа второй строки и завершив вторым символом десятой строки?

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

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

:y
:yank

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

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

Добавлено: 22 мар 2008, 22:10
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:\*.* :)Какая маска самая жадная?
т.к.в линуксе нет расширений, то это просто *

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

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

Добавлено: 23 мар 2008, 04:19
Semiono
Регулярное выражение.

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

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

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

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

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

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

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

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

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

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

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

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

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


типа памятка по sed...

Добавлено: 23 мар 2008, 08:53
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 {}
но что не так?

Добавлено: 24 мар 2008, 17:47
cympak
Semiono писал(а): здаётся мне что grep так же как и sed не работает с подкаталогами :?
man grep:

-R, -r, --recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.

Добавлено: 24 мар 2008, 18:14
Llama
cympak, скажем так - на -R особо расчитывать нечего. У этих инструментов есть одна проблема - ключики от платформы к платформе меняются, расчитывать можно в лучем случае на POSIX и корректную работу с кодировкой latin1.

Добавлено: 25 мар 2008, 08:13
Semiono

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

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