Замените слово каждые N строк на sed между определенным интервалом строки - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть входной файл:

Line 1 a
Line 2 b
Line 3 c
Line 4 d
Line 5 e
Line 6 f
Line 7 g
Line 8 h
Line 9 i
Line 10 j
Line 11 k
Line 12 l
Line 13 m
Line 14 n
Line 15 o
Line 16 p
Line 17 q
.
.
.

Я хочу вставить с sed через определенный интервал строки, скажем, между строкой 3 и строкой 17 файла, слово, которое заменяет последнее слово каждогострока через каждые 4 строки.

В этом случае, скажем, я хочу поместить Z в строку 3 файла, затем строку 7 файла (т.е. 3 + 4), затем строку 11файл (т.е. 7 + 4), затем строка 15 файла (т.е. 11 + 4).

Есть ли способ сделать это с помощью sed, но просто открыть только один раз файл, который я хочуменять?

Ожидаемый результат будет:

Line 1 a
Line 2 b
Line 3 Z
Line 4 d
Line 5 e
Line 6 f
Line 7 Z
Line 8 h
Line 9 i
Line 10 j
Line 11 Z
Line 12 l
Line 13 m
Line 14 n
Line 15 Z
Line 16 p
Line 17 q
.
.
.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Используя POSIX sed, вы можете сделать:

sed '3,17{s/[^ ]*$/Z/;n;n;n;}'

Альтернативой может быть awk, который можно сделать более гибким:

awk 'NR==3,NR==17{if (c++%4==0) { $NF="Z" }}1'
0 голосов
/ 21 ноября 2018

Если у вас есть GNU sed, вы можете использовать строковую адресацию <i>first</i>~<i>step</i> :

sed '3,17{3~4s/\S*$/Z/}' infile

Во-первых, мы ограничиваем все действия диапазоном адресов с помощью 3,17{...}.

Затем в фигурных скобках запустим следующее:

3~4s/\S*$/Z/

"В строке 3 и в каждой четвертой строке заменим последнее слово строки (\S*$ - самая длинная последовательностьнепробельных символов) с Z ".

...