У меня есть около 12 тыс. файлов с такой строкой:
script_oid("1.3.6.1.4.1.25623.7.0.391810");
Мне нужно изменить последние 6 цифр (391810) на последовательный идентификатор, начинающийся с 300000. Пока я сделал это:
`find . -type f -name '*.nasl' -exec sed -i -e 's/script_oid("1.3.6.1.4.1.25623.7.0.\(.*\)/script_oid("1.3.6.1.4.1.25623.1.0.\1/g' {} \;`
Я пробовал некоторые идеи с AWK, но пока не нашел решения. Итак, мне нужна помощь здесь. Я запускаю это на Ubuntu 16.04.
Заранее спасибо за вашу помощь.
С наилучшими пожеланиями,
Привет @EdMorton, я не хочу изменять несколько строк, только строку, которую я упомянул в своем посте script_oid("1.3.6.1.4.1.25623.7.0.391810");, которая представляет собой одну строку в более чем 12 000 файлов. Я хочу изменить последние 6 цифр в строке (1.3.6.1.4.1.25623.7.0.391810 — последние 6 будут 391810) на порядковый номер, начинающийся с 300000. Я пробовал SED, но, как я сказал в своем посте, я нужна помощь здесь. Заранее спасибо!
Похоже, вы хотите изменить несколько строк, они просто распределены по нескольким файлам. Так что покажите это как минимальный воспроизводимый пример. Скажем, 3 файла с этой строкой в контексте в каждом файле вместе с небольшим количеством действительно репрезентативных других строк или окружающего текста в тех же строках, которые вы не хотите изменять. Если это действительно всего 1 строка в 1 файле, просто используйте vi.
@EdMorton: Нет, я не хочу изменять несколько строк. Только одна (1) отдельная строка на более чем 12 000 файлов. Эта строка, которую мне нужно изменить, это script_oid("1.3.6.1.4.1.25623.7.0.391810");.
Когда скрипт будет готов, будет изменено более 1 строки, так что это звучит как несколько для меня, но как бы вы ни хотели это сказать... создайте минимальный воспроизводимый пример, который демонстрирует ваши требования, и мы можем протестировать, если вы хотите получить хороший ответ .
@EdMorton: Просто чтобы вы знали, что ответ tshiono идеален и решил проблему.
Хорошо, спасибо за продолжение. Он потерпит неудачу по-разному, учитывая различное возможное содержимое входного файла (например, он не экранирует . в регулярном выражении, поэтому они будут соответствовать любому символу, а не только строкам, которые вы пытаетесь сопоставить), он имеет ненужную избыточность (a группа захвата вокруг фиксированной части строки + обратная ссылка было бы лучше), и это крайне неэффективно (см. unix.stackexchange.com/q/169716/133219), но это здорово, что вы довольны единственным ответом, который вы получили, и мне жаль, если вы чувствовали, что я пытался сделать что-нибудь, кроме как помочь вам с моими комментариями.





Пожалуйста попробуйте:
id=300000
while IFS= read -r -d "" f; do
sed -e "s/script_oid(\"1.3.6.1.4.1.25623.7.0.\(.*\)/script_oid(\"1.3.6.1.4.1.25623.1.0.$id/g" "$f"
id=$((++id))
done < <(find . -type f -name '*.nasl' -print0)
Обратите внимание, что id присваивается в порядке появления find.
Если вы хотите изменить несколько строк, опубликуйте минимальный воспроизводимый пример (включая ввод и вывод) с несколькими строками, чтобы у нас было что-то, что поможет продемонстрировать ваши требования, и мы можем протестировать потенциальное решение. См. Как спросить, если это неясно.