The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Удаление/замена текста"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Удаление/замена текста"  
Сообщение от visitor (ok) on 07-Июн-06, 01:03 
Здравствуйте, Уважаемые.
Помоги решить след. задачу.
Есть куча файлов в которых требуется удалить одинаковый текст и взамен его вставить другой текст.
Буду очень признателен за программку на перле или шелле.
Заранее спасибо.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Удаление/замена текста"  
Сообщение от allez (ok) on 07-Июн-06, 06:04 
>Здравствуйте, Уважаемые.
>Помоги решить след. задачу.
>Есть куча файлов в которых требуется удалить одинаковый текст и взамен его
>вставить другой текст.
>Буду очень признателен за программку на перле или шелле.
>Заранее спасибо.


Ох, блин, в рот вам пароход и в жопу баржу! А учиться кто за вас будет?!
Программку, программку... Вам вот такой строчки за глаза хватит:

for i in <куча_файлов>; do cat $i | sed 's/"ненужный текст"/"другой текст"/g' > /tmp/tmpfile; mv /tmp/tmpfile $i; done

P.S. Будьте человеком, не поленитесь поискать в Сети по запросу "Advanced Bash-scripting
guide", а также купите себе книгу Дэвида Тейнсли "UNIX и Linux: программирование в Shell".
Есть еще небольшой справочник Андрея Шевеля "Linux. обработка текстов". Почитайте, а?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Удаление/замена текста"  
Сообщение от phpcoder email(??) on 07-Июн-06, 06:20 
>for i in <куча_файлов>; do cat $i | sed 's/"ненужный текст"/"другой текст"/g' > /tmp/tmpfile; mv /tmp/tmpfile $i; done

Несколько моментов от меня:

- чтобы не перечислять все файлы вручную можно искать их find'ом
- чтобы не порождать лишний раз процесс (я про cat) можно указать sed'у файл
- чтобы не создавать лишний файл можно воспользоваться ключиком -i

Мой вариант:

find <где искать> <условия> -print | while read FILE; do sed -i 's|текст1|текст2|g' "$FILE"; done


P.S. 2allez: вы сами, видимо, тоже не полностью "Advanced Bash-scripting guide" осилили (иначе бы не плодили лишнего cat'а)... впрочем как и я ;)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Удаление/замена текста"  
Сообщение от Doka (ok) on 07-Июн-06, 07:36 
>>for i in <куча_файлов>; do cat $i | sed 's/"ненужный текст"/"другой текст"/g' > /tmp/tmpfile; mv /tmp/tmpfile $i; done
>
>Несколько моментов от меня:
>
>- чтобы не перечислять все файлы вручную можно искать их find'ом
>- чтобы не порождать лишний раз процесс (я про cat) можно указать
>sed'у файл
>- чтобы не создавать лишний файл можно воспользоваться ключиком -i
>
>Мой вариант:
>
>find <где искать> <условия> -print | while read FILE; do sed -i 's|текст1|текст2|g' "$FILE"; done
>
>
>P.S. 2allez: вы сами, видимо, тоже не полностью "Advanced Bash-scripting guide" осилили
>(иначе бы не плодили лишнего cat'а)... впрочем как и я ;)
>

если воспользоватья опцией -exec у find , то будет еще короче :-)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Удаление/замена текста"  
Сообщение от phpcoder email(??) on 07-Июн-06, 07:51 
>если воспользоватья опцией -exec у find , то будет еще короче :-)

Про -exec слышал, но так как не использовал, то не очень уверен, что смогу инструкйию быстро и правильно написать и использовать, поэтому тогда уж я бы использова xargs :)

find <где искать> <условия> -print0 | xargs -r sed -i 's|текст1|текст2|g'

Вроде бы это должно работать :)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Удаление/замена текста"  
Сообщение от phpcoder email(??) on 07-Июн-06, 07:52 
>find <где искать> <условия> -print0 | xargs -r sed -i 's|текст1|текст2|g'

find <где искать> <условия> -print0 | xargs -r0 sed -i 's|текст1|текст2|g'

Забыл про -0

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Удаление/замена текста"  
Сообщение от allez (ok) on 07-Июн-06, 10:44 
>- чтобы не перечислять все файлы вручную можно искать их find'ом
>- чтобы не порождать лишний раз процесс (я про cat) можно указать
>sed'у файл
>- чтобы не создавать лишний файл можно воспользоваться ключиком -i
>
>Мой вариант:
>
>find <где искать> <условия> -print | while read FILE; do sed -i 's|текст1|текст2|g' "$FILE"; done
>
>
>P.S. 2allez: вы сами, видимо, тоже не полностью "Advanced Bash-scripting guide" осилили
>(иначе бы не плодили лишнего cat'а)... впрочем как и я ;)
>


(Устало) Да в курсе я, в курсе и про find, и про ключ "-i" у sed. Я выяснение этих
обстоятельств оставил автору темы в качестве, так сказать, домашнего задания. Выдал я ему
"рыбу", корявую, но работоспособную, а дальше уж пускай сам ее улучшает :-). Повторюсь:
учиться-то за него кто будет?

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

Что же касается связки "cat | sed", то это уже въевшаяся намертво привычка: при работе в
командной строке мне так удобнее - быстрее менять аргументы у sed (или awk, или еще чего).
Насколько правильно это с точки зрения идеологии и правильно ли вообще, честно признаться,
фактор мало трогающий. И плодить "лишние" процессы мне совсем не боязно: не на PDP-11,
чай, работаем :-).

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

7. "Удаление/замена текста"  
Сообщение от visitor (ok) on 07-Июн-06, 21:59 
>>- чтобы не перечислять все файлы вручную можно искать их find'ом
>>- чтобы не порождать лишний раз процесс (я про cat) можно указать
>>sed'у файл
>>- чтобы не создавать лишний файл можно воспользоваться ключиком -i
>>
>>Мой вариант:
>>
>>find <где искать> <условия> -print | while read FILE; do sed -i 's|текст1|текст2|g' "$FILE"; done
>>
>>
>>P.S. 2allez: вы сами, видимо, тоже не полностью "Advanced Bash-scripting guide" осилили
>>(иначе бы не плодили лишнего cat'а)... впрочем как и я ;)
>>
>
>
>(Устало) Да в курсе я, в курсе и про find, и про
>ключ "-i" у sed. Я выяснение этих
>обстоятельств оставил автору темы в качестве, так сказать, домашнего задания. Выдал я
>ему
>"рыбу", корявую, но работоспособную, а дальше уж пускай сам ее улучшает :-).
>Повторюсь:
>учиться-то за него кто будет?
>
>К слову, про find: почему, во-первых, вы посчитали, что у автора темы
>"куча файлов"
>разбросана по разным каталогам (может, как раз в одном в кучу свалены
>;-)), а во-вторых, с
>чего вы взяли, что я ему предложил "перечислять все файлы вручную"? Я
>вообще-то
>подразумевал указание маски :-).
>
>Что же касается связки "cat | sed", то это уже въевшаяся намертво
>привычка: при работе в
>командной строке мне так удобнее - быстрее менять аргументы у sed (или
>awk, или еще чего).
>Насколько правильно это с точки зрения идеологии и правильно ли вообще, честно
>признаться,
>фактор мало трогающий. И плодить "лишние" процессы мне совсем не боязно: не
>на PDP-11,
>чай, работаем :-).


Спасибо, большое.
Все строки заменяються.
Но почему никак не работает замена такого типа:

#!/bin/sh

sed 's/"<OPTION VALUE=\"384\">"COTE D\'IVOIRE"<\/OPTION>"/"<option value='US' SELECTED>United States</option>"/g' inputfile >newfile

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Удаление/замена текста"  
Сообщение от allez (ok) on 08-Июн-06, 05:23 
>Спасибо, большое.
Да пожалуйста :-).

>Все строки заменяються.
>Но почему никак не работает замена такого типа:
>
>#!/bin/sh
>
>sed 's/"<OPTION VALUE=\"384\">"COTE D\'IVOIRE"<\/OPTION>"/"<option value='US' SELECTED>United States</option>"/g' inputfile >newfile

А тут вам кавычки, одинарные да двойные, воду мутят. Сделайте так:
sed "s/<OPTION VALUE=\"384\">COTE D'IVOIRE<\/OPTION>/<option value='US' SELECTED>United States<\/option>/g"

Должно заработать (по крайней мере у меня замена произошла). И еще один момент:
аргументы для sed вовсе не обязательно заключать в кавычки, то есть вместо команды
sed 's/"старая строка"/"новая строка"/' нужно писать: sed 's/старая строка/новая строка/'.
Заморочек меньше :-). А в своем первом сообщении я поставил кавычки только для того,
чтобы обозначить, что данный параметр - строковой. Вы же не стали, я надеюсь, заключать
список ваших файлов в угловые скобки (это я про <куча_файлов>) ;-)?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Удаление/замена текста"  
Сообщение от visitor (ok) on 08-Июн-06, 15:50 
>>Спасибо, большое.
>Да пожалуйста :-).
>
>>Все строки заменяються.
>>Но почему никак не работает замена такого типа:
>>
>>#!/bin/sh
>>
>>sed 's/"<OPTION VALUE=\"384\">"COTE D\'IVOIRE"<\/OPTION>"/"<option value='US' SELECTED>United States</option>"/g' inputfile >newfile
>
>А тут вам кавычки, одинарные да двойные, воду мутят. Сделайте так:
>sed "s/<OPTION VALUE=\"384\">COTE D'IVOIRE<\/OPTION>/<option value='US' SELECTED>United States<\/option>/g"
>
>Должно заработать (по крайней мере у меня замена произошла).

да, работает, спасибо.

>И еще один
>момент:
>аргументы для sed вовсе не обязательно заключать в кавычки, то есть вместо
>команды
>sed 's/"старая строка"/"новая строка"/' нужно писать: sed 's/старая строка/новая строка/'.
>Заморочек меньше :-). А в своем первом сообщении я поставил кавычки только
>для того,
>чтобы обозначить, что данный параметр - строковой. Вы же не стали, я
>надеюсь, заключать
>список ваших файлов в угловые скобки (это я про <куча_файлов>) ;-)?

ну, хватит, прикалываться :)))
спасибо.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Удаление/замена текста"  
Сообщение от allez (ok) on 08-Июн-06, 17:34 
>спасибо.

Еще раз пожалуйста. Да, а вы опробовали на практике советы других участников этой темы?
Они ведь, в отличие от меня, халтуру не гнали, а выдавали по-настоящему красивые решения.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

11. "Удаление/замена текста"  
Сообщение от Асен Тотин email on 08-Июн-06, 21:33 
Привет,

My two cents, как говорят братья-американцы - если файлов много и надо произвести замену разных стирнгов, то иногда помогает неболькая программка по имени rpl (помесь find и sed) - найдите ее себе в Гугле, не пожалеете.

WWell,

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

12. "Удаление/замена текста"  
Сообщение от Pikador (ok) on 09-Июн-06, 01:01 
>Привет,
>
>My two cents, как говорят братья-американцы - если файлов много и надо
>произвести замену разных стирнгов, то иногда помогает неболькая программка по имени
>rpl (помесь find и sed) - найдите ее себе в Гугле,
>не пожалеете.
>
>WWell,


Замечательная вещь, сенкс а лот :)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру