Er ... Можете ли вы использовать более короткое имя переменной? На самом деле это не так, как часть вашего скрипта, которая делает его длинным.
При этом вы можете немного оптимизировать. Не зная, как выглядит остальная часть вашего входного файла, я не могу быть уверен, но один или некоторые из них могут работать для вас.
Прежде чем мы начнем, слово предупреждения. Эти параметры sed (а также один в вашем вопросе) будут терпеть неудачу, если переменная содержит любые символы, будут интерпретироваться или переведены sed. Это означает, что строка не может содержать косой черты (/
), а также не может содержать строки, которые бы превратились в ссылки регулярных выражений (\1
и др.). Чтобы решить эту проблему, например, Баш, вы можете использовать следующее, чтобы удалить все не алфавитно-цифровые символы из строки:
kSchemeScheduleQueue="${kSchemeScheduleQueue//[^[:alnum:]]/}"
Во-первых, использовать двойные кавычки, чтобы избежать лишних одинарные на линии. С помощью этой опции, мы также предполагаем, что строка =
не появляется где-то еще перед переменной, вы заинтересованы в.
sed -i "/kSchemeScheduleQueue = /s/= .*/= $kSchemeScheduleQueue;/" config.cc
Далее, если вы хотите разделить ваши линии с реальными символами новой строки, вы должны разделить вещи на несколько операторов, каждая из которых находится на линии. Здесь мы выполняем вашу замену в фигурных скобках, если поиск выполняется успешно. Это работает, потому что пробелы перед командой s
ubstitute игнорируются. На самом деле это не короче, но линии короче.
sed -i '/kSchemeScheduleQueue = .*/{;
s/ = .*/ = '"$kSchemeScheduleQueue"';/;}' config.cc
Третий вариант Я предлагаю не использовать sed, а awk вместо этого. Это не чертовски много короче, чем ваш оригинальный сценарий sed, но длина явно вызвана вашим именем переменной. Кроме того, следующее не редактирует файл на месте, поэтому вам нужно будет обернуть вокруг него некоторый скрипт для обработки этой части.
awk -v s="$kSchemeScheduleQueue" '$1=="kSchemeScheduleQueue"{$3=s} 1' config.cc
Вы также можете сделать это в скорлупе в одиночку (более легко, если эта оболочка является Баш/КШ/ЗШ/рыба), но это приведет к более команды, а не короче, хотя бы устранить SED зависимость ,
Для ссылок параметр '-r' является септимом GNU. Серийный эквивалент BSD - '-E', хотя последние версии FreeBSD включают в себя« -r »как эквивалентную опцию. OSX по-прежнему использует символ -E для обозначения ERE. Лучше всего включить платформу, для которой предназначено ваше решение, если вы предоставите ответы на платформе. – ghoti
@ghoti Я всегда предоставляю ответы на конкретные платформы. – potong