2016-02-09 4 views
1

У меня несколько команд командной строки, которые немного длинны. Один из них заключается в следующем:Как разбить команду sed на несколько строк

sed -i 's/kSchemeScheduleQueue = .*/kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc 

Я попытался разбить его, добавив \ в середине, как

sed -i 's/kSchemeScheduleQueue = .*/\ 
      kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc 

Но это добавляет новую строку и несколько пробелов в моем файле. Я видел где-то еще, что обратная косая черта кажется неэффективной в одиночных кавычках.
Я также пробовал двойные кавычки, следующее работало бы, никаких дополнительных пробелов или новых строк, но с плохим отступом, так как мои команды sed находятся в вложенном петле for, а вторая строка ниже должна быть без отступов.

sed -i "s/kSchemeScheduleQueue = .*/\ 
kSchemeScheduleQueue = $kSchemeScheduleQueue;/" config.cc 

Мне просто интересно, есть ли простой способ разделить седло на несколько строк для моего случая. Благодарю.

ответ

2

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 зависимость ,

1

Это может работать для вас (GNU СЭД):

sed -ri 's/(kSchemeScheduleQueue =).*/\1'"$kSchemeScheduleQueue"';/' config.c 

укорачивает команду с помощью обратной ссылки.

+0

Для ссылок параметр '-r' является септимом GNU. Серийный эквивалент BSD - '-E', хотя последние версии FreeBSD включают в себя« -r »как эквивалентную опцию. OSX по-прежнему использует символ -E для обозначения ERE. Лучше всего включить платформу, для которой предназначено ваше решение, если вы предоставите ответы на платформе. – ghoti

+0

@ghoti Я всегда предоставляю ответы на конкретные платформы. – potong