Как использовать sed для замены третьего вхождения того же регулярного выражения в файле? - PullRequest
3 голосов
/ 30 ноября 2011

У меня проблема с поиском сценария sed, который работает, когда регулярное выражение выглядит точно так же, но я хочу заменить его только одним.

Файл выглядит так:

something someting something
this 
something someting something
something someting something
this 
someting something
someting something
someting something
this
someting something
someting something
this

Я хочу заменить третье «это» чем-то другим. Я пробовал с:

sed '3,/this.*/s/this.*/something/'

и различные подобные попытки, но это не работает.

Ответы [ 4 ]

4 голосов
/ 30 ноября 2011

Это не просто в sed, но awk может это сделать

awk '/this/{count++;if(count==3){sub("this","something")}}1'
2 голосов
/ 30 ноября 2011

Попробуйте что-то вроде:

# do nothing the first 2 times (weird sed counting makes that 3)
3,/this.*/n
# then, substitute only once
1,/this.*/ s/this.*/foo/ 

Чтобы встроить новую строку в сценарий оболочки, я бы, вероятно, обманул, используя GNU "echo -e" для вставки "\ n":

sed -e "$(echo -e "3,/this.*/n\n1,/this.*/ s/this.*/foo/ ")"
1 голос
/ 30 ноября 2011

Это может работать для вас:

 sed '/this/{x;s/^/X/;/^XXX$/!{x;b};x;s/this/something/}' file

Пояснение:

Для каждого вхождения this добавьте X в область удержания (HS). Когда HS содержит 3 X, замените this на something.

EDIT:

Это тоже будет работать (основная идея та же):

sed -e '/this/{x;s/^/X/;/^XXX$/!{x;b};x;c\something' -e '}' file
1 голос
/ 30 ноября 2011

Я бы даже не пошел так далеко, чтобы сказать, что это невозможно в sed;Я бы определенно сказал, что это не подходящий инструмент для этой работы.Я бы заглянул в Perl, но выбрал ваш язык сценариев.

Не проверено!

#!/usr/bin/env perl
use strict;
use warnings;
my $this_count = 0;
LINE:
while (<>)
{
    if (m/^this$/ && ++$this_count == 3)
    {
        $_ = "that\n";  # Note the newline; I didn't chomp!
    }
    print;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...