Добавить код к каждой строке в наборе файлов
В настоящее время я добавляю некоторые примеры кодов в набор файлов, используя следующий код
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 за ссылку в комментариях.