1

背景:我正在使用 ZenCart php 软件,我想用 sed 编辑不同的主题,但使用相同的 php 文件。因此,通过 sed 对主题进行了一些自动更改。

s1=$'<img itemprop="image" src="'\'' . zen_output_string($src) . '\''"'   
sed -i.bak -r 's/$image = '\''<img src="'\'' \. zen_output_string\($src\) \. '\''" alt="'\'' \. zen_output_string\($alt\) \. '\''"'\'';/'"$s1"/ html_output.php

这运行正常,但文件中没有任何更改,为什么,有什么问题?

编辑我设法解决了这个问题,产生了以下脚本:

echo "Updating your Zencart theme's files..."
echo "Creating backups of important files."
mkdir -p ./zentmp/includes/functions && cp ./includes/functions/html_output.php ./zentmp/includes/functions/ && mkdir -p ./zentmp/includes/templates && cp -Rf ./includes/templates/ ./zentmp/includes/templates && mkdir -p ./zentmp/includes/classes && cp ./includes/classes/breadcrumb.php /zentmp/includes/classes/
echo "Updating theme file /includes/functions/html_output.php"
s1=$'itemprop="image" src="'\'' . zen_output_string($src) . '\''"'
sed -i -r 's/src="'\'' \. zen_output_string\(\$src\) \. '\''"/'"${s1}"/ html_output.php
echo "File updated..."
s2=$'itemprop="image" class="imgLink"'
for dir in ./zentmp/includes/templates/*/
do
dir=${dir%*/}
echo "Updating theme file /$dir/tpl_modules_main_product_image.php" (1/2)
sed -i -r 's/class="imgLink"/'"${s2}"/ ./$dir/tpl_modules_main_product_image.php
echo "Updating theme file /$dir/tpl_modules_main_product_image.php" (2/2)
s3=$'title="'\'' . addslashes($products_name) . '\'' itemprop="image"'
sed -i -r 's/title="'\'' \. addslashes\(\$products\_name\) \. '\''"/'"${s3}"/ ./$dir/tpl_modules_main_product_image.php
done

上面的工作很好,直到下面的代码:

for dir2 in ./zentmp/includes/templates/*/
do
dir2=${dir2%*/}
s4=$"<span itemprop="name"><?php echo \$products_name; ?>"
sed -i -r 's/<?php echo \$products_name; ?>'/'"${s4}"/ ./$dir2/tpl_product_info_display.php
done

根据要求,我将按使用顺序发布我要替换的片段:

$image = '<img src="' . zen_output_string($src) . '" alt="' . zen_output_string($alt) . '"';

$image = '<img itemprop="image" src="' . zen_output_string($src) . '" alt="' . zen_output_string($alt) . '"';

第二:

<span class="imgLink">

<span  itemprop="image" class="imgLink">

第三:

$rel . '" title="' . addslashes($products_name) . '">

$rel . '" title="' . addslashes($products_name) . '" itemprop="image">

请注意,第二个 sed 使用了两次。

4

1 回答 1

1
sed -r -i.bak --posix "/$image = '<img src=/ s/<img src=/<img itemprop=\"image\" src=/
/<span class=/ s/class=/itemprop=\"image\" class=/
/\\$rel.*title.*addslashes/ s/> *$/ itemprop=\"image\">/
" sample.txt

3部分,每个搜索和有限的行与预期的模式,而不是只替换里面需要的部分(避免大量的“和'通过shell转换)

\" 环绕图像是简化所必需的(如果由于 shell 和 sed 替换,在最后一次搜索时需要在 s/ \$ 的搜索模式中捕获 ",则可以使用类似 \1 的后退模式

--posix 允许在非 GNU sed 中重用相同的 sed 代码

于 2013-11-03T08:46:33.373 回答