SED: работать с последними семью строками независимо от длины файла - PullRequest
0 голосов
/ 24 января 2011

Я бы хотел работать с последними 7 строками файла с помощью sed независимо от длины файла.

В соответствии с связанным вопросом этот тип диапазона не будет работать: $-6,$ {..commands..}

Какой эквивалент будет?

Ответы [ 5 ]

2 голосов
/ 24 января 2011

Соедините вывод tail -7 в sed.

tail -7 test.txt | sed -e "s/e/WWW/"

Подробнее о трубах здесь.

1 голос
/ 24 января 2011

Вы можете просто переключиться с sed (1) на ed (1), команды примерно одинаковы. В этом случае команда является такой же, за исключением случаев, когда нет ограничений на диапазон адресов.

$ cat > fl7.ed
ed - $1 << \eof
1,7s/$/ (one of the first seven lines)/
$-6,$s/$/ (one of the last seven lines)/
w
q
eof
$ sh fl7.ed yourfile
0 голосов
/ 05 июня 2012

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

sed ':a;1,6{$!N;ba};${s/foo/bar/g;q};N;D' file

Пояснение:

  • Создать метку цикла. :a
  • Соберите строки с 1 по 6 в пространстве образца (PS). 1,6{$!N;ba}
  • Если это последняя строка, обработайте PS и выйдите, поэтому распечатайте последние семь строк. ${s/foo/bar/g;q}
  • Если это не последняя строка, добавьте следующую строку в PS. N
  • Удалить до первой новой строки и начать новый цикл без чтения новой строки. D
0 голосов
/ 24 января 2011

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

sed '1{N;N;N;N;N};N;$s/foo/bar/g;P;D' inputfile

Объяснение:

  • 1{N;N;N;N;N} - при чтении первой строки загрузите пространство шаблона еще с пятью строками (всего: 6 в этот момент)
  • N - добавить еще одну строку
  • $s/foo/bar/g - когда прочитана последняя строка, выполнить некоторую операцию со всем содержимым пространства шаблона (последние семьстроки файла).Операции могут быть более сложными, чем показано здесь
  • P - распечатать тест перед первой новой строкой в ​​шаблонном пространстве
  • D - удалить только что напечатанный текст и выполнить цикл до началаскрипт (шаг «добавить еще одну строку» - первая инструкция пропускается, поскольку она применяется только к первой строке в файле)
0 голосов
/ 24 января 2011
perl -lne 'END{print join$\,@a,"-",@b}push@a,$_ if@a<6;push@b,$_;shift@b if@b>7'

В блоке END{} вы можете делать все, что требуется;@a содержит первые 6, @b последние 7 строк по запросу.

...