URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4921
[ Назад ]

Исходное сообщение
"sed удалить первое вхождение строки"

Отправлено Алёша Головин , 15-Авг-24 12:49 
Здравствуйте подскажите пожалуйста по sed
мануал курил, но похожего не нашел

Нужно удалять каждую первую строку, начинающююся на "#", если подряд идут две или более строк начинающихся на "#".

дано:
cat test.txt
#text1
text2
#text3
#text4

нужно:

#text1
text2
#text4

Я сделал на питоне, но приходится тащить его отдельно, что нехорошо. Думается с помощью sed это будет проще и быстрее, если конечно знать как.
Спасибо


Содержание

Сообщения в этом обсуждении
"sed удалить первое вхождение строки"
Отправлено Аноним , 15-Авг-24 19:15 
зачем sed, когда ты его будешь вызывать из баш, а на баше такое реализуется без стартования дочерних процессов, по человечески, понадобится только обычный советский... [читать далее >>]

...цикл по строкам.


"sed удалить первое вхождение строки"
Отправлено Pahanivo , 16-Авг-24 18:19 
На sed можно оперировать по многостроку, через буфера. Но там синтаксис наркомания чистой воды.
ИМХО вообще тут самое место perl regex.


"sed удалить первое вхождение строки"
Отправлено Аноним , 17-Авг-24 03:54 
awk 'BEGIN {ORS=""}; {prev=str; str=$0; str ~ /^#/ ? has=1:has=0; prev ~ /^#/ ? had=1:had=0; if (had && has && !del) del=1; else {print prev; ORS="\n"}; if (!has) del=0}; END {if (del || !had || !has) print str}'  test.txt

"sed удалить первое вхождение строки"
Отправлено Pahanivo пробегал , 22-Авг-24 23:12 
>  awk 'BEGIN {ORS=""}; {prev=str; str=$0; str ~ /^#/ ? has=1:has=0; prev
> ~ /^#/ ? had=1:had=0; if (had && has && !del) del=1;
> else {print prev; ORS="\n"}; if (!has) del=0}; END {if (del ||
> !had || !has) print str}'  test.txt

но вот тут по сравнению с sed таблетки не такие жоссские .... можно понять