2015-09-14 3 views
0

Я пытался выполнить команду sed и не увенчался успехом.Неизвестная команда `> 'с sed

Вот команда sed, которую я пытаюсь использовать;

sed -i "/<\/Testing>/i '<Tester>$VAR</Tester>'" filename 

Я получаю a unknown command: < ... Я знаю, почему, но там не было удачи. Одиночные кавычки в порядке, однако значение $VAR не отображается, а только буквальная строка.

Для читателей, которые не очень знакомы с sed, это регулярное выражение, за которым следует команда i, а не неряшливый манекен замены "s%<Testing>%$VAR%". Команда i вставляет строку перед соответствующей строкой. Другими словами, когда ввод соответствует </Testing>, я хочу добавить фрагмент, который описывает тестовый пример перед соответствующей строкой.

+2

Пожалуйста [править] Ваш вопрос, чтобы показать образец вашего вход и желаемый выход. Вы пытаетесь выполнить замену? –

+2

Кажется, что вы не располагаете достаточной информацией. Я могу воспроизвести то, что вы описываете, с помощью 'VAR = $ ' \ n'; СЕПГ «/ <\/Testing>/я„ $ VAR“» <<<$' \ nmoo \ п \ npoo \ п «', но есть очень количество догадок о том, что вы могли бы делать участие. – tripleee

+0

Возможный дубликат [Найти и заменить переменную оболочки переменной многострочной оболочки] (http://stackoverflow.com/questions/27912791/search-and-replace-shell-variable-with-multiline-shell-variable) – NeronLeVelu

ответ

-2

Вы должны указать определенную команду, как «S» (в начале):

sed -i "s/</Testing>/i '$VAR'" filename 

Кроме того, было бы лучше, если бы вы показать пример ввода и вывода

+0

Я не знаю, Думаю, он пытается выполнить какие-либо подстановки, но добавляет строку, следующую за ''. – chepner

+0

Команда ('i') сразу после адреса ('/<\/Testing>/'), где она принадлежит. –

1

Если $VAR содержит строку , вам нужно обратная косая черта - убегите.

vnix$ VAR=$'<hello>\n</hello>' 

vnix$ sed "/<\/Testing>/i '<Tester>$VAR</Tester>'" <<<$'<Testing>\nmoo</Testing>\n(end)' 
sed: -e expression #1, char 33: unknown command: `<' 

vnix$ VAR=$'<hello>\\\n</hello>' 

vnix$ sed "/<\/Testing>/i '<Tester>$VAR</Tester>'" <<<$'<Testing>\nmoo</Testing>\n(end)' 
<Testing> 
'<Tester><hello> 
</hello></Tester>' 
moo</Testing> 
(end) 

(Я также предполагаю, что Вы на самом деле не хотите, одинарные кавычки замещаемого значения, но это, очевидно, легко исправить.)

+2

Хорошая детективная работа :) Я предполагаю, что вы неявно предполагаете версию sed, которая понимает, что нужно указать строку, которая будет вставлена ​​в ту же строку, что и 'i' (стандарт говорит, что нужно использовать' i \ 'и помещать ее в следующий линия). –

+0

Если вам нужно сделать программную замену, вы можете использовать 'nl = $ '\ n'; VAR = "$ {VAR // $ нл/\\ п}" '. –

Смежные вопросы