Профиль: Аноним (вход | регистрация) неRU opennet.me  
OpenNET

[ новости /+++ | форум | теги |    ]



"sed удалить первое вхождение строки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на рабочей станции (Разное / Linux)
Изначальное сообщение [ Отслеживать ]

"sed удалить первое вхождение строки"  +/
Сообщение от Алёша Головин (?), 15-Авг-24, 12:49 
Здравствуйте подскажите пожалуйста по sed
мануал курил, но похожего не нашел

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

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

нужно:

#text1
text2
#text4

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


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

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

Ответить | Правка | Наверх | Cообщить модератору

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

Ответить | Правка | Наверх | Cообщить модератору

3. "sed удалить первое вхождение строки"  +1 +/
Сообщение от Аноним (3), 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
Ответить | Правка | Наверх | Cообщить модератору

4. "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 таблетки не такие жоссские .... можно понять

Ответить | Правка | Наверх | Cообщить модератору

5. "sed удалить первое вхождение строки"  +/
Сообщение от Аноним (5), 16-Сен-26, 16:16 
#!/usr/bin/env perl

use strict;
use warnings;

my ($pos,$count, $key);
my (@text, @index, @del);
my %unique;

while (<>) {
    push @text, split /\n/;
    if (/^#/) {
        $pos = $.;
        $count++;
    } else {
        $count = 0;
    } if ($count == 2) {
        push @index, ($pos - 2);
    }
}
for (@index) {
    $key = "$text[$_]";
    push @del, $key;
}
%unique = map { $_ => 1 } @del;
@text = grep { ! $unique{$_} } @text;
for (@text) {
    print "$_\n";
}

./program test.txt

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




XSQUARE
Inferno Solutions
Hosting by Hoster.ru
Хоcтинг:

Закладки на сайте
Проследить за страницей
Created 1996-2026 by Maxim Chirkov
Добавить новость, Поддержать