我正在使用sed用变量替换文件中的字符。该变量基本上是读取文件或网页的内容,其中包含多个类似于Hash的字符串,如下所示,它们是随机生成的:
define('AUTH_KEY', 'CVo|BO;Qt1B|+GE}+h2/yU7h=5`/wRV{>%h.b_;s%S8-p|>qpf]|/Vf@`&[g~*:&');
define('SECURE_AUTH_KEY', '{G2-<^jWRd7]2,?]6hhM^*asg.2C.+k=gf33-m+ZK_{Mt|q*<ELF4|gPjyxtTh!)');
define('LOGGED_IN_KEY', 'jSNo9Z;5d]tzZoh-QQ`{M-&~y??$R({:*m`0={67=+mF?L.e+R{;)+4}qCAAHz=C');
define('NONCE_KEY', '19Vt4=%8j/Z-&~ni0S<]9)J^~sy9dh|h9M_RX2#K0]F9+.v+[BP1d&B&}-FTKIJ,');
define('AUTH_SALT', 'jr7f?T|@Cbo]XVAo}N^ilkvD>dC-rr]5{al64|?_Hz }JG$yEi:_aU )Olp YAD+');
define('SECURE_AUTH_SALT', 'hm#Z%O!X_mr?lM|>>~r-?F%wi R($}|9R[):4^NTsj+gS[qnv}7|+0<9e-$DJjju');
define('LOGGED_IN_SALT', 'tyPHBOCkXZh_4H;G|^.&|^#JPB/f;{}y_Orj!6AH?@wovx+KKtTZ A[HMS9SZJ|N');
define('NONCE_SALT', 'Eb-/t 5D-vPV9I--8F<[^lcherGv.g+|7p6;+xP|5g6P}tup1K.vuHAQ=uWZ#}H^');
变量被定义为:
KEY=$(cat keyfile)
我使用以下SED语法:
sed -i "s/stringtoreplace/$KEY/" /path/to/file
我还尝试了使用单样的不同变体,围绕变量的引号
sed -i "s/stringtoreplace/"$KEY"/" /path/to/file
sed -i "s/stringtoreplace/"${KEY}"/" /path/to/file
sed -i "s/stringtoreplace/'$KEY'/" /path/to/file
我认为我"野蛮"以列出报价,我不知道如何逃脱像这样的随机生成的角色。我不断收到以下错误:
未终止的
s
命令
关于如何用怪异的锤子变量替换字符串的任何建议?
sed是在单行上简单替换的绝佳工具,但是对于其他任何东西,您都应该使用尴尬:
awk -v key="$KEY" '{sub(/stringtoreplace/,key)}1' file
除了" $ key"包含哪些字符,除了"&amp;"。
一种可能性是使用bash代替 sed
。这使替换变得容易,但是您必须模仿-i
选项。
类似的东西:
TMPFILE=$(mktemp)
KEY=$(cat keyfile)
while IFS= read -r LINE; do
echo "${LINE//stringtoreplace/$KEY}"
done </path/to/file >$TMPFILE
mv $TMPFILE /path/to/file
尝试以下:
KEY=$(cat keyfile | sed -e 's/[]/()$*.^|[]/\&/g')
sed -i "s/stringtoreplace/$KEY/" /path/to/file
问题是$ key变量包含斜率,这是您的s
命令的分界符。
SED可以做的不仅仅是搜索和替换:
sed '/stringtoreplace/{
d
r keyfile
}' /path/to/file
我假设" StringToreplace"在一条线上自行出现。