Bash-скрипт для редактирования группы файлов
-
06-07-2019 - |
Вопрос
Чтобы обработать кучу данных и подготовить их к вставке в нашу базу данных, мы генерируем несколько сценариев оболочки.Каждый из них имеет около 15 строк, по одной для каждой таблицы, в которую передаются данные.В одном из недавних пакетов импорта некоторые файлы импорта не смогли попасть в одну конкретную таблицу.Итак, у меня есть куча шелл-скриптов (около 600), в которых мне нужно закомментировать первые 7 строк, а затем перезапустить файл.В этой папке находится около 6000 сценариев оболочки, и ничто о конкретном файле не может сказать мне, нуждается ли он в редактировании.У меня есть список файлов, которые я извлек из выходных данных базы данных.
Итак, как мне написать сценарий bash (или что-нибудь еще, что будет работать лучше), чтобы взять этот список имен файлов и для каждого из них закомментировать первые 7 строк и запустить сценарий?
РЕДАКТИРОВАТЬ:
#!/usr/bin/env sh
cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8
Не уверен, насколько это читабельно.По сути, к первым 7 строкам (не считая первой строки) необходимо добавить # в начало.Примечание:файлы были отредактированы, чтобы сделать каждую строку короче и частично исключить копирование из VIM.Но в основной части каждого файла есть строка, начинающаяся с echo, а затем строка, начинающаяся с sqlldr.
Решение
Используя sed, вы можете указать диапазон номеров строк в файле, который нужно изменить.
#!/bin/bash
while read line
do
# add a comment to beginning of lines 1 - 7 and rename the script
sed '3,9 s/^/#/' $line > $line.new
exec $line.new
done < "filelist.txt"
Возможно, вы захотите проверить это, прежде чем запускать все эти сценарии...
РЕДАКТИРОВАТЬ:изменил номера строк, чтобы отразить комментарии.
Другие советы
Грубо говоря:
#!/bin/sh
for file in "$@"
do
out=/tmp/$file.$$
sed '2,8s/^/#/' < $file > $out
$SHELL $out
rm -f $out
done
Предполагая, что вас не волнует проверка условий гонки и т. д.
ex кажется созданным для того, чем ты хочешь заниматься.
Например, для редактирования одного файла с документом здесь:
#!/bin/sh
ex test.txt << END
1,12s/^/#/
wq
END
Это закомментирует первые 12 строк в «test.txt».Для вашего примера вы можете попробовать "$FILE"
или подобное (включая кавычки!).
Затем запустите их обычным способом, т.е. ./"$FILE"
редактировать: $SHELL "$FILE"
вероятно, это лучший подход для их запуска (от одного из комментаторов выше).
В конечном итоге вам понадобится использовать команду Linux sed.Какую бы логику вам ни пришлось поместить в сценарий, вы знаете.Но ваш сценарий в конечном итоге вызовет sed. http://lowfatlinux.com/linux-sed.html