Bash脚本用另一个文件替换此模式

时间:2019-07-11 14:50:08

标签: bash replace

我正在尝试创建一个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

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在替换字符串中获取其内容。