我试图写一个单行程序来转换一些文件中存在的HTML实体(所有的HTML与UTF-8编码)
我试过recode HTML_4.0 file.htm但也转换非ASCII字符(它打破了UTF-8字符)
在StackOverflow中,我发现了一个适用于一个文件的东西:
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(bashvariables),所以PHP不会将其读取为PHPvariables。 有什么build议?
你几乎在那里。
碰巧,问题不在于如何去做,而是如何让bash解释variables并将其传递。
你有:
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认为它们是可插值的variables,并将它们replace掉。
使用bash,(单个)引号'用于防止参数扩展(variables)。 所以你应该在你的bash调用php中反转单引号和双引号的用法,并为php命令arg添加转义的双引号:
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