2016-06-27 4 views
1

В сценарии оболочки, я получаю определенное количество строки в файле и сохранить его в переменной, используя этот код:Запись в определенной строке номер файла с помощью переменной

res=$(grep -n '123' somefile.txt | sed 's/^\([0-9]\+\):.*$/\1/') 

сейчас Я хочу написать в 3 строках после этой строки, поэтому я использовал эти коды:

sed -i '$res\anything' somefile.txt 
sed -i '$resianything' somefile.txt 

но они не работают. Кажется, что sed не принимает переменные. Как я могу это решить? Есть ли альтернативный способ?

ответ

1

Некоторые советы, прежде чем указать на duplication:

  • переменные не будут расширены в single quotes.
  • Переменные границы имен не определяются автоматически. $resianything не будет расширяться до значения переменной res, за которой следует строка ianything, а скорее значение переменной с именем resianything, которое предположительно пустое. Вы можете обнаружить эту ошибку, добавив set -o nounset (и идеально -o errexit) в верхней части вашего скрипта.
  • Вы обязательно захотите escape строку, которую вы вставляете обратно в команду sed.
+0

s/avoid/detect/ –

+0

Но запись '$ {res} ianything' будет работать до тех пор, пока переменные будут расширены, ... –

+0

Sure; все это объясняется ссылкой на цитаты. Вероятно, это не подходящее место для полного ознакомления с Bash. – l0b0

1

Вы, кажется, спрашиваете, почему $res не распространяется. Это не вопрос sed; это оболочка. Обычно bash & c. не расширяйте переменные в одинарных кавычках. Попробуйте двойное цитирование этого бита.

Кроме того, одним из способов разделения вашей переменной на следующий буквенно-цифровой текст является использование фигурных скобок. Попробуйте ${res}anything вместо $resanything, например.

+0

привет, спасибо. Я использовал >> sed -i $ {res} ianything somefile.txt, и он сработал. без i, в конце $ {res} i он не писал «a» в первом из чего-либо – pouya