Добавить код к каждой строке в наборе файлов

В настоящее время я добавляю некоторые примеры кодов в набор файлов, используя следующий код

cd /path/to/your/files
word='code'
base=1
for file in *; do sed -i -e "s/^/$word$base/" "${file}"; base=$(( $base + 1 )); done

Это добавляет термин "code1" перед каждой строкой в ​​file1, code2 перед каждой строкой в ​​файле 2 и т. Д.

Что я действительно хотел бы сделать, так это попросить эту команду добавить 'code1' к каждой строке кода, содержащейся в файле 1, файле 2 и т. Д. Есть ли простой способ сделать это?

Дополнительный вопрос: как я могу сказать этому сценарию добавить 'code1' к каждой 4-й строке каждого файла, начиная со 2-й строки, чтобы строки в файле 1 читались

line1
code1line2
line3
line4
line5
code1line6
line7
line8

file2 будет следовать той же схеме, но добавит префикс code2.

1 ответ

Решение

Для OS X sed нет функции адреса шага, поэтому вам нужно использовать N Команда для объединения нескольких строк.

[2addr]N

Добавьте следующую строку ввода в пространство шаблона, используя встроенный символ новой строки, чтобы отделить добавленный материал от исходного содержимого. Обратите внимание, что текущий номер строки изменяется.

Например:

$ seq 1 10 | sed -e "{ N;s/.*/code1 &/; }"
code1 1
2
code1 3
4
code1 5
6
code1 7
8
code1 9
10

Если вы используете GNU sed (как в linux), обратитесь к разделу Адреса справочной страницы sed, указанной выше:

: Первый шаг ~

Соответствуйте каждой строке шага, начиная с первой строки. Например, ''sed -n 1~2p'' напечатает все нечетные строки во входном потоке, а адрес 2~5 будет совпадать с каждой пятой строкой, начиная со второй. первым может быть ноль; в этом случае sed работает так, как если бы он был равен шагу. (Это расширение.)

Чтобы продемонстрировать его использование:

seq 1 10 | sed -e "1~2s/.*/code1 &/"

Печать:

code1 1
2
code1 3
4
code1 5
6
code1 7
8
code1 9
10

Etan Reisner за ссылку в комментариях.

Другие вопросы по тегам