глупый вопрос про sed

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

глупый вопрос про sed

Сообщение elide »

нужно мне в тексте взять все слова, написанные большыми буквами перевести в маленькие и обрамить \emph{}, кроме тех, которые уже внутри \emph{}. те, которые уже внутри, надо просто преобразовать в маленькие.

все, до чего я дошел с моим знанием регулярных выражений, это строчка

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

cat testfile |
sed -e 's/\\emph{\([QAZWSXEDCRFVTGBYHNUJMIKOLP ]\+\)}/\1/g'
-e 's/\<[QAZWSXEDCRFVTGBYHNUJMIKOLP ]\+\>/\\emph{&}/g'

подозреваю, что это очень уж через задницу, но...
остался вопрос, как теперь содержимое \emph{} преобразовать в маленькие буквы???

P.S. а никто не видел книжек, типа "SED для чайников: освой за 40 минут" ??
слава роботам!
Спасибо сказали:
Самовар
Сообщения: 31

Re: глупый вопрос про sed

Сообщение Самовар »

Прекрасная статья Дэна Роббинса:
http://www-106.ibm.com/developerworks/linu...ary/l-sed1.html
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: глупый вопрос про sed

Сообщение elide »

действительно прекрасная статья, но в ней нет ничего, чего бы я не знал... печально...

ладно, а вот еще задачка, может кто знает...
есть 4 метра текста в формате "абзацы разделены пустыми строками" надо переделать в текст в формате "один абзац в одну строку, без пустых разделяющих"
файл с досовыми переводами строк. т.е. идет 'строка0D0A'. по идее, если /.$/ матчит 0D, то /$/ должен матчить OA, но нет... и в этом вся проблема.... вопрос - как объеденить две строки в одну???
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: глупый вопрос про sed

Сообщение madskull »

Вторая задачка очень даже проста.
Во-первых, для убирания досовского наследия существует утилитка dos2unix.
Если же ее нет, поможет sed 's/\r//g'

А в целом, задачу можно решить так:

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

sed -i -n 's/\r//g;H;${g;s/\n\{2,\}/\r/g;s/\n/ /g;s/\r/\n/g;p}' text.txt

-i -- результат работы записывать в исходный файл
-n -- не выводить ничего, кроме того, что мы захотим
s/\r//g -- вышеобозначенное досоукрощение
H -- добавить строку в буфер
${...} -- если последняя строка, выполнить то, что в скобках
g -- текст из буфера в pattern space, грубо говоря, в рабочий регистр.
s/\n\{2,\}/\r/g -- заменяем все концы строк (если их два и более, т.е. конц абзаца) на временный символ, пусть будет \r
s/\n/ /g -- заменяем все оставшиеся концы строк на пробелы
s/\r/\n/g -- вертаем взад концы абзацев
p -- вывод того, что получилось

А вот первая задачка посложнее будет, с первого взгляда решения не вижу. Будет время, посмотрю второй раз :)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: глупый вопрос про sed

Сообщение elide »

о-о-о! вот это я понимаю thinking in *x way (:
а я все возился с одиночными абзацами - типа, обрабатываем только непустые строки (от пустых как раз переводы строк и остануться) так - заменяем окончания на пробелы. только я перевод строки пытался не через \n, а через $ уловить. глупо...
слава роботам!
Спасибо сказали: