1

如果我退出使用变量,只是将正则表达式直接写入最后一个 sed 命令,一切正常。但是就在这里,没有替换吗?

#!/bin/bash
#html substitutions
ampP="\&"
ampR="&"

ltP="\<"
ltR="<"

gtP="\&gt;"
gtR=">"

quotP="\&quot;"
quotP2='\&#8220;'
quotP3="\&#8221;"
quotR="\""

tripDotP="\&#8230"
tripDotR="..."

tickP="\&#8217;"
tickR="\´"

#get a random page, and filter out the quotes
#pick a random quote
#translate wierd html symbols
curl "www.yodaquotes.net/page/$((RANDOM % 9 +1))/" -Ls | sed -nr 's/.*data-text=\"([^\"]+)\".*/\1/p' \
| sort -R | head -n1 \
| sed 's/"$ampP"/"$ampR"/g; s/$ltP/$ltR/g; s/$gtP/$gtR/g; s/$quotP/$quotR/g; s/"$quotP2"/"$quotR"/g; s/$quotP3/$quotR/g; s/$tripDotP/$tripDotR/g; s/$stickP/$stickR/g'
4

2 回答 2

1

这个 sed 不起作用:

sed 's/"$ampP"/"$ampR"/g'

因为错误的 shell 引用。您的 shell 变量根本不会用单引号展开。尝试使用这种形式:

sed "s~$ampP~$ampR~g"
于 2013-10-08T14:33:00.107 回答
1

调试 101:让我们echo看看 sed 收到的内容:

echo 's/"$ampP"/"$ampR"/g; s/$ltP/$ltR/g; s/$gtP/$gtR/g; s/$quotP/$quotR/g; s/"$quotP2"/"$quotR"/g; s/$quotP3/$quotR/g; s/$tripDotP/$tripDotR/g; s/$stickP/$stickR/g'

s/"$ampP"/"$ampR"/g; s/$ltP/$ltR/g; s/$gtP/$gtR/g; s/$quotP/$quotR/g; s/"$quotP2"/"$quotR"/g; s/$quotP3/$quotR/g; s/$tripDotP/$tripDotR/g; s/$stickP/$stickR/g

现在看起来不像,是吗?

bash 中的单引号内没有变量替换。这就是为什么我们有两个不同的报价,因此您可以决定哪一个更适合该任务。

为了便于阅读,我建议将每个 sed 命令放在双引号内。

像这样:"s/$ampP/$ampR/g"

于 2013-10-08T14:33:21.533 回答