Sed - 用一个充满奇怪字符的变量替换一个字符串

时间:2014-02-03 18:38:05

标签: bash variables unix sed escaping

我正在使用sed用变量替换文件中的字符。这个变量基本上是读取包含多个类似哈希的字符串的文件或网页的内容,这些字符串是随机生成的:

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命令

关于如何用类似奇怪哈希的变量替换字符串的任何建议?

4 个答案:

答案 0 :(得分:3)

sed是一个很好的工具,可以在一行上进行简单的替换,但对于其他任何你应该使用awk的工具:

awk -v key="$KEY" '{sub(/stringtoreplace/,key)}1' file

除了“&amp;”。

之外,无论“$ KEY”包含什么字符,都可以使用

答案 1 :(得分:1)

一种可能性是使用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

答案 2 :(得分:0)

试试这个:

KEY=$(cat keyfile | sed -e 's/[]\/()$*.^|[]/\\&/g')
sed -i "s/stringtoreplace/$KEY/" /path/to/file

答案 3 :(得分:0)

问题是$ KEY变量包含斜杠,它是s命令的分隔符。

sed可以做的不仅仅是搜索和替换:

sed '/stringtoreplace/{
     d
     r keyfile
}' /path/to/file

我假设“stringtoreplace”单独出现在一条线上。