Форум русскоязычного сообщества Ubuntu


Автор Тема: Замены в текстовом файле  (Прочитано 3446 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Замены в текстовом файле
« : 07 Мая 2013, 19:30:30 »
Добрый день!
Мне довольно часто приходится иметь дело с текстовыми файлами, содержащими разнородный текст, в котором иногда встречаются значения переменных, например:С8='Исполнение регламента' С7='Приложенный документ - паспорт' 'Просто комментарий'. Все осложнено тем, что в значении переменной могут быть любые символы - двойные кавычки, пробелы и даже перевод строки. Хочу написать программу по обработке данного файла, чтобы она делала:
1) принимала со стандартного ввода файл, который я передам как cat file.txt |
2) принимала два аргумента
    - какую переменную менять, например С8
    - на что менять, например 'Кот в сапогах'.
3) находила бы все значения переменной -  например С8='что-то...' и меняла бы на С8='Кот в сапогах'
4) измененный файл выдавала на стандартный вывод.
И итоге вызов выглядел как-то так:
cat text.txt | superproga C8 'Кот в сапогах' > result.txt
Когда то я немного писал на С, в Linux могу составить простой скрипт на bash. Какое средство мне использовать? Хотелось что-то более-менее готовое, может быть sed? Что посоветуете?
« Последнее редактирование: 07 Мая 2013, 19:32:30 от Alexey_Pr »
С уважением, Алексей.
http://tulalinux.ru

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Замены в текстовом файле
« Ответ #2 : 08 Мая 2013, 15:32:10 »
Очень полезная ссылка, но подустал я с этим sed, реально!
Выяснилось, что у меня в файле может содержатся " ' / , а это управляющие символы sed. А менять мне придется не на крошечную строку, а сразу на несколько строк. Поэтому я:
1)подготовил файл для замены:
sed -e 's/"/KAV_2/g' shablon.xml | sed -e "s/'/KAV_1/g"| sed -e "s/\//OBR_SLESH/g" >exch
заменив все управляющие символы на текстовые последовательности и записал все в exch
2) затем я все-таки попробовал заменить, такой командой:
cat shablon.xml|sed -e "s/C8='.*'/С8=$(cat exch)/g"
и получаю ошибку sed: -e выражение #1, символ 53: незавершенная команда `s'

По крайней мере узнал про sed
С уважением, Алексей.
http://tulalinux.ru

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Замены в текстовом файле
« Ответ #3 : 08 Мая 2013, 16:02:45 »
Код: (bash) [Выделить]
$ echo -n '"' | od -h ; echo -n "'" | od -h
0000000 0022
0000001
0000000 0027
0000001

$ ( echo '"' ; echo "'" ; echo "/" ) | sed 's/\x22/1/g;s/\x27/2/g;s%/%3%g;'
1
2
3

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Замены в текстовом файле
« Ответ #4 : 08 Мая 2013, 16:33:32 »
Не поспоришь, ваши решения по замене спецсимволов элегантнее моего.

Но я тут понял, что вообще в 3-х соснах заблудился, решение такое:
1) создаю файл puper с заменой, в нем написано С8='<?xml version="1.0" encoding="utf-16"?>//r/ ... тут еще ерунды на 47 Кб' , все в 1 строку
2) делаю так:
cat shablon.xml | sed -e "s%C8='.*'%$(cat puper)%g" > new.xmlВ итоге читаем из исходного файла shablon.xml, меняем все C8='.*' на строку из моего файла и итог в new.xml
Работает хорошо, спасибо!

Раньше был косяк в том, что в строке замены (и в puper) были символы перевода строки. Когда копировал из другого документа они туда попали, а если есть перевод строки то вся конструкция с sed разваливалась.

С уважением, Алексей.
http://tulalinux.ru

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Замены в текстовом файле
« Ответ #5 : 08 Мая 2013, 17:19:36 »
Многострочная обработка тоже реализуема:
http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/

Ещё можно awk поглядеть и perl'овые регэкспы для grep — тоже бывает полезно.

 

Страница сгенерирована за 0.034 секунд. Запросов: 25.