3

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

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i 's/$updatenaamold/$updatenaamnew/g' $naam_dir
echo "name changed"

Это должно работать! Но это не так, в файле, который я хочу отредактировать, есть имя "Брайан", я хочу отредактировать его до "Брайан имя". Я поместил старое имя в переменную, которую мне нужно ввести, и новое имя в переменную. Может кто-нибудь указать мне, почему это не работает?

2 ответа2

6

Просто используйте двойную кавычку вместо одинарной. (Одиночные кавычки не допускают расширения переменных).

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i "s/$updatenaamold/$updatenaamnew/g" $naam_dir
echo "name changed"

Примечание 1: если $naam_dir - это каталог, он тоже не будет работать. AFAIK sed работает на основе файлов с помощью файла.

Примечание 2: если пользователь вводит специальные символы (например, / ^ $ [] ), все будет работать не так, как ожидалось, потому что это может запутать sed. Обходной путь (не уверен, что это будет лучшим способом):

updatenaamold=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamold" | sed 's/[^a-zA-Z0-9]//g' )
updatenaamnew=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamnew" | sed 's/[^a-zA-Z0-9]//g' )

Добавьте это перед сед. Он удалит символы, отличные от букв и цифр (без пробелов, без международных символов и т.д.). Другим подходом будет прерывание при обнаружении странных символов (и предотвращение случайных ошибок).

1

Поскольку вы используете bash я бы посоветовал использовать проверку манипуляций со строками bash.

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