我正在尝试编写一行代码来转换某些文件中存在的 html 实体(所有 html 均采用 UTF-8 编码)
我试过了
recode HTML_4.0 file.htm
,但这也会转换非 ASCII 字符(它会破坏 UTF-8 字符)
在堆栈溢出我发现了适用于一个文件的东西:
php -r '$f=@fopen("file.htm", "r");echo html_entity_decode(fread($f, 20000));fclose($f);'
但当我尝试使用
for fi in *.htm; do php -r '$f=@fopen("$fi", "r");echo html_entity_decode(fread($f, 20000));fclose($f);';done
我知道这里的问题是如何“转义” $fi (bash 变量),以便 PHP 不会将其读取为 PHP 变量。有什么建议吗?
答案1
你是非常就快到了。
事实上,问题不在于如何去做,而在于如何让 bash 解释变量并传递它们。
你有:
for fi in *.htm; do php -r '$f=@fopen("$fi", "r");echo html_entity_decode(fread($f, 20000));fclose($f);';done
其中有单引号,里面有双引号。
bash 不会在单引号内插入,但会插入双引号,因此如果将其更改为:
for fi in *.htm; do php -r "\$f=@fopen(\"$fi\",'r');echo html_entity_decode(fread(\$f, 20000));fclose(\$f);"; done
因为我们现在使用双引号,所以我们还必须转义 $ 符号,否则 bash 会认为它们是可插值变量,并将其替换掉。
答案2
在 bash 中,使用 (单) 引号'
来防止参数扩展 (变量)。因此,您应该在 bash 调用 php 时反转单引号和双引号的使用,并为 php 命令参数添加转义的双引号:
for fi in *.htm; do fi=\"$fi\"; php -r "\$f=@fopen($fi, 'r');echo html_entity_decode(fread(\$f, 20000));fclose(\$f);"; done
或者更简单一点,根据迈克尔·汉普顿的回答, 做就是了:
for fi in *.htm; do cat $fi | php -R 'echo html_entity_decode($argn);'; done