Помогите с регуляркой

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

Модератор: Bizdelnick

apvs
Сообщения: 52

Помогите с регуляркой

Сообщение apvs »

Есть текстовый файл с кучей строк типа

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

some text</p>
<p class="lin1">another text

some text</p>
<p class="lin1">Another text
Мне нужно заменить везде в файле </p>\n<p class="lin1"> на пробел, но только если another text начинается с буквы в нижнем регистре.
Как это сделать через sed/awk?

То есть результат должен быть такой:

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

some text another text

some text</p>
<p class="lin1">Another text
Представляю что-то типа sed 's/<\/p>\n<p class="lin1">/ /g', но вот как поставить условие проверки регистра первой буквы текста?
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 1007
ОС: BSD/LINUX

Re: Помогите с регуляркой

Сообщение bars »

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

'/another/s/<\/p>\n<p class=\"lin1\">//'
Должен работать, но не работает хз прочему.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
apvs
Сообщения: 52

Re: Помогите с регуляркой

Сообщение apvs »

Вместо "some text" и "another text" там в файле может быть любой текст, состоящий из латинских букв. То есть буквально "another" не надо вписывать, это просто для примера.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 904
ОС: debian, fedora (i3-wm)

Re: Помогите с регуляркой

Сообщение olecya »

Для ГНУ сед:

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

sed -i 'N;/\<p>\n<p class="lin1">[a-z]/!{P;D};d' file
Если возможны не аски символы, то замените [a-z] на [[:lower:]]
Добавлено (17:27):
Что-то я напутала, систему настраиваю шрифт не привычный. Не правильно задачу поняла
Добавлено (17:40):
Тестируйте:

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

sed 'N;s/<\/p>\n<p class="lin1">\([[:lower:]]\)/ \1/;t;P;D' file
На всякий случай убрала опцию -i после тестов вставите
Спасибо сказали:
apvs
Сообщения: 52

Re: Помогите с регуляркой

Сообщение apvs »

Вот я пока до чего дошел для GNU sed

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

sed ':a;N;$!ba;s/<\/p>\n<p class="lin1">[a-z]/ /g' -i file
или кроссплатформенно

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

sed -e ':a' -e 'N' -e '$!ba' -e 's/<\/p>\n<p class="lin1">[a-z]/ /g' -i file
Получается почти как мне нужно, но при этом удаляет первую букву из "another text". Надо ее как-то сохранить. Как?

upd: Чтобы сохранить, надо в скобки поставить

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

sed ':a;N;$!ba;s/<\/p>\n<p class="lin1">\([a-z]\)/ \1/g' -i file
Добавлено (17:54):
olecya писала:
12.12.2021 17:25
Тестируйте:
Сработало. Спасибо.
Спасибо сказали: