Я використовую наведений нижче код для заміни рядка всередині сценарію оболонки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
але його замінюють $replace
замість значення цієї змінної.
Хтось міг сказати, що пішло не так?
Я використовую наведений нижче код для заміни рядка всередині сценарію оболонки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
але його замінюють $replace
замість значення цієї змінної.
Хтось міг сказати, що пішло не так?
Відповіді:
Якщо ви хочете інтерпретувати $replace
, вам не слід використовувати одинарні лапки, оскільки вони перешкоджають підміні змінних.
Спробуйте:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
припускаючи, що ви хочете вставити лапки. Якщо ви не хочете цитати, використовуйте:
echo $LINE | sed -e "s/12345678/${replace}/g"
Стенограма:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
Тільки будьте обережні, переконайтесь, що в них ${replace}
немає жодних значень sed
(як, /
наприклад,), оскільки це може викликати плутанину, якщо не вдасться уникнути. Але якщо, як ви говорите, ви замінюєте одне число іншим, це не повинно бути проблемою.
set
також не є необхідним (і як ви все-таки збиралися ним користуватися?). Просто replace=987654321
.
export
для того, щоб встановити змінні для дітей, але, як ви кажете, ви можете так само легко уникнути цього. Однак використання або відсутність export
тут не має значення (проблема зі стилем) і не впливає на фактичну відповідь, тобто як використовувати змінні в sed
команді.
-i
опцією. Чи знаєте ви чому? або як змусити це працювати?
$
або `
в sed
скрипті було використано зворотну скісну риску, щоб захистити його від механізму заміни оболонки на рядки з подвійними лапками .
ви можете використовувати оболонку (bash / ksh).
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
на багатьох сучасних Linux.
Не специфічно для питання, але для людей, яким потрібна така ж функціональність, розширена для ясності з попередніх відповідей:
# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
# this is just how this feature works :/
result=${str//$find/$replace}
echo $result
# result is: someFileName.bar
str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.sally because ".foo" was not found
Знайшли витончене рішення .
echo ${LINE//12345678/$replace}
echo $LINE | sed -e 's/12345678/'$replace'/g'
ви все ще можете використовувати одинарні лапки, але вам доведеться "відкривати" їх, коли ви хочете, щоб змінна розширилася в потрібному місці. інакше рядок сприймається "буквально" (як правильно вказав @paxdiablo, його відповідь також правильна)
$replace
за межами будь-яких лапок призведе до того, що оболонка виконає токенізацію пробілів та розширення символів підстановки для значення. Здається, це працює з простими значеннями, але може різко підірвати нетривіальні рядки. Не використовуйте це у виробничому коді.
Щоб ваша оболонка розширювала змінну, вам потрібно використовувати подвійні лапки типу
sed -i "s#12345678#$replace#g" file.txt
Це зламається, якщо $replace
містить спеціальні sed
символи ( #
, \
). Але ви можете попередньо обробити $replace
цитати:
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
Я мав подібну вимогу до цього, але мій замінник var містив амперсанд. Втеча з амперсанда таким чином вирішила мою проблему:
replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
Використовуйте це замість цього
echo $LINE | sed -e 's/12345678/$replace/g'
це працює для мене, просто видаліть лапки
Я вважаю за краще використовувати подвійні лапки, оскільки одинарні лапки дуже потужні, як ми їх використовували, якщо не можемо щось змінити всередині них або може викликати змінну заміну.
тому використовуйте встановлені подвійні лапки.
echo $LINE | sed -e "s/12345678/$replace/g"