Страница 1 из 1

Поиск и замена символов в файле через bash

Добавлено: 24 июл 2022, 22:19
madesta
Условие задачи:
1. Убрать в текстовом файле из строк символы </p>
2. Убрать в текстовом файле из строк выражение <p> (до <p> 4 пробела).

Предприняты попытки:
1. Через sed
sed -i ‘s/</p>//g’ filename
sed -i ‘s/ <p>//g’ filename
В первом случае ошибка: /p: Нет такого файла или каталога
Во втором случае ошибка: p: Нет такого файла или каталога
2. Через awk
awk '{sub(/</p>/, ); print filename}' > filename1
Ошибка: недействительный символ '�' в выражении
awk '{sub(/ <p>/,); print filename}' > filename1
Ошибка: 1 - неверное число аргументов для sub

М.б. кто подскажет приемлемый способ через bash?
Нужно именно через bash, так как задача является второй частью скрипта. Первая часть отрабатывается нормально.

Текст для замены под спойлером.
В спойлере не отобразилось, но в оригинальном файле через xed перед символом <p> имеется 4 пробела.
Эх, не вовремя я курить бросил!</p>
<p>Затушил последнюю сигарету и почти сразу неприятности посыпались. Тем более, я классический попаданец. Ну, может, и не совсем, но сейчас попал знатно. К тем самым эльфийкам, оркам, магам и прочим обитателям Порубежья.</p>
<p>Из минусов:</p>
<p>На меня охотятся даже в собственном мире почти все трехбуквенные службы: МВД, ФСБ, ГРУ и даже НТВ! А один олигарх так и вовсе… Но то отдельная история!</p>
<p>Да еще и девушка изменяет (эх, печаль-тоска!) изощренно.</p>
<p>Патронов вот не так много осталось. Да и дизеля всего полканистры.</p>
<p>Но и плюсы имеются: </p>
<p>У меня остались связи, старый и дубовый, но надежный джип и полуавтоматический дробовик. Кроме того, я всегда могу вернуться. </p>
<p>Ах, да, еще и девушка изменяет (ура, свобода!)</p>
<p>Еще есть цель:</p>
<p>Спасти и доставить домой ушастую принцессу (а как же иначе?!), решившую погулять по улочкам простого российского городка. А если не получится — уничтожить.</p>
<p>Ничего не забыл?</p>
<p>Ну, конечно, мое любимое: если спать, так с королевой! Но не клинков же?!!

Поиск и замена символов в файле через bash

Добавлено: 24 июл 2022, 23:26
slant
А экранировать спецсимволы в регулярном выражении кто будет? Разумеется оно так не работает. Подсказка - символ "/" нужно экранировать. Читайте документацию по regexp (регуляркам). И sed и awk ищут именно через них, а не тупо набор символов.
А вообще для написания регулярок с разбором и подсказками есть такой неплохой сайт: https://regex101.com

Поиск и замена символов в файле через bash

Добавлено: 25 июл 2022, 04:02
madesta
Пришлось, конечно, помучиться (сразу пристрелить себя не решился :-D ), но озвученную свою проблему решил.

Поиск и замена символов в файле через bash

Добавлено: 25 июл 2022, 15:26
rogoznik
madesta, как-то так

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

sed -i 's/\s\{4\}<p>|<\/p>//' filename

Поиск и замена символов в файле через bash

Добавлено: 25 июл 2022, 16:27
slant
rogoznik, Вторую часть можно записать короче и гораздо универсальней <\/*p>.
А в целом виде для этой задачи совсем корректно будет так: (\s{2,})*<\/*p>