Что это за сообщения javaScript vim?

Это легко решить с помощью awk.

В отличие от использования sedв цикле, это решение считывает входные файлы и записывает выходной файл только один раз и использует только один процесс. Это будет быстрее для более длинного списка имен файлов.


Предполагая, что файл с именами файлов называется filenames, а ваш ввод со строками, которые нужно изменить, называется input, вы можете использовать

awk 'NR == FNR {name[i++]=$0;next} /^output = filename$/ { $3 = name[j++]; } 1' filenames input > output

Пояснение:

Условие NR == FNRверно только для первого файла. name[i++]=$0;сохраняет строку в массиве name, nextпропускает дальнейшую обработку этой строки. (Также можно использовать name[NR]=$0;next.)

/^output = filename$/соответствует заменяемым строкам, $3 = name[j++];заменяет третье поле именем из массива. Я использую новый индекс jвместо i, чтобы снова начать отсчет с 0.

1— условие «всегда верно» с неявным действием по умолчаниюprint

Примечания:Если строки, которые нужно изменить, выглядят по-другому в вашем реальном вводе, сценарий может не работать. Нет обработки ошибок для случая, когда файл filenamesсодержит меньше данных, чем количество строк, подлежащих замене.

2
03.08.2021, 09:29
0 ответов

Теги

Похожие вопросы