Страница 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 читал
лесс только через | less юзал
вот такие мы совсем ниграмотные
Добавлено: 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 не обязательно конечно)