我正在尝试创建一个bash脚本来替换所有出现的
<?= /* @noEscape */ __('any random string, of any length') ?>
使用
<?= $block->escapeHtml(__('any random string, of any length')) ?>
在特定文件或目录中。
问题在于内部字符串可以是任何东西。
到目前为止,我已经尝试使用sed
。也许这不是最好的方法。
有什么想法吗?
#!/bin/bash
sed 's/\/\* @noEscape \*\/ __\('.*'\)/$block->escapeHtml\('.*'\)\)/g' $1 > $1.test
mv $1.test $1
答案 0 :(得分:0)
我不太确定,如果您真的想用。*替换内部字符串,我想您想用原始字符串替换,对吧?
那么你可以做:
#!/bin/bash
sed -e"s|/\* @noEscape \*/ __(\('.*'\))|\$block->escapeHtml(\1)|g" $1 > $1.test
mv $1.test $1
如果您确实要用。*替换内部字符串(例如,如果您打算生成一个正则表达式):
#!/bin/bash
sed -e"s|/\* @noEscape \*/ __(\('.*'\))|\$block->escapeHtml('.*')|g" $1 > $1.test
mv $1.test $1
在两个版本中,我都使用's|...'
信号后面的第二个字符s
sed,即要使用的分隔符。我选择了|
,所以不需要逃脱/
。
如果要用外壳变量$block
的内容替换block
,则只需删除上面\
之前的$block
。
(
正则表达式中的 sed
(不带转义)表示字符(
,而\(
是捕获组的开始,以\)
结尾,因此(\('.*'\))
捕获由('
和')
包围的字符串,并将其放入捕获组。因为它是正则表达式中的第一个捕获组,所以可以通过\1
在替换字符串中获取其内容。