Как я удаляю согласующий отрезок длинной линии, строку выше и тот ниже ее, с помощью sed?

У меня есть следующая последовательность, происходящая многократно в файле:

yyyy
xxxx
zzzz

У меня есть regex, который соответствует xxxx. Каждый раз, когда существует соответствие, я хочу удалить ту строку, строка прежде (например. yyyy) и строка после него (например. zzzz). Как я могу использовать sed, чтобы сделать это?

11
задан Ben Lever 18 May 2009 в 06:27
поделиться

3 ответа

Уловка заключается в том, чтобы сохранить последнюю строку, видимую в «удерживаемом пространстве».

sed -n '
/^xxxx/{n
        n
        x
        d
       }
x
1d
p
${x
  p
 }
' <input file>

Начиная с x - поменять местами текущую строку ввода с удерживаемым пространством ( x ), то для первой строки ничего не печатать ( 1d ), последующие строки печатают строку, только что замененную из удерживаемого пространства ( p ), в последней строке снова поменяйте местами удерживаемое пространство и напечатайте, что в нем было ( $ x {xp} . Остается, что делать, когда мы попадаем в целевую строку (начиная с / ^ xxxx / ]) - считайте следующие две строки в пространство шаблонов ( nn ) и поменяйте местами пространство шаблонов с пространством удержания ( x ) - это оставляет пространство удержания со следующей строкой, которую мы хотим для печати и пространство образца со строкой перед совпадением, что нам не нужно,поэтому мы бросаем его ( d )

13
ответ дан 3 December 2019 в 09:21
поделиться

This is how I would do it in perl maybe it can help send you on the right track... Good luck!

open(INFILE,"<in.txt");
my(@arrayOutBoundData, $skipNextLine)l
for (<INFILE>) {
    if (not $skipNextLine) {
        if (/^xxxx$/) {
            pop(@arrayOutBoundData);
            $skipNextLine = 1;
        } else {
            push(@arrayOutBoundData,$_);
        }
    }
$skipNextLine = 0
}

open(OUTFILE,">out.txt");
for (@arrayOutBoundData) {
    print OUTFILE;
}

(Not tested no perl on this system please forgive any over site.)

0
ответ дан 3 December 2019 в 09:21
поделиться

Вы можете проверить этот документ . Он описывает использование sed для работы с несколькими строками.

0
ответ дан 3 December 2019 в 09:21
поделиться