1

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

Это мой файл.

$ cat file.txt
one
two
three
four
five

Когда я пытаюсь без использования переменных, это работает нормально.

$ sed -i '$i name' file.txt
$ cat file.txt
one
two
three
four
name
five

Когда я использую переменную, она не работает. Я пробовал разные комбинации двойных кавычек и обратной косой черты.

$ NAME=name
$ sed -i '$i "$NAME"' file.txt
$ cat file.txt
one
two
three
four
"$NAME"
five

2 ответа2

1

В bash одинарные кавычки предназначены для фиксированных литеральных строк. Двойные кавычки используются там, где вы хотите, чтобы произошла интерполяция переменных, подстановка команд и т.д.

Ваша команда sed должна использовать как литерал $ (чтобы команда i применялась к последней строке файла), так и $NAME для интерполяции переменной. Чтобы сделать это, вам нужно "экранировать" литерал $ обратной косой чертой, чтобы оболочка не интерпретировала $i в вашем сценарии sed как «заменить содержимым переменной $ i» вместо «literal $ за которым следует литерал». i ":

Кстати, лучше тестировать подобные вещи, не используя опцию -i , чтобы sed не испортил ваш входной файл, пока вы выясняете правильный синтаксис. Добавьте -i позже, когда вы уверены, что он делает именно то, что вы хотите.

$ NAME=name
$ sed "\$i $NAME" file.list 
one
two
three
four
name
five
0

По-другому:

$ NAME=name
$ sed '$i '"$NAME" file.list
one
two
three
four
name
five

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .