如何解析一堆文件并替换每次出现的 __esct 函数?
__esct('Full name')
转换成:
$this->escape($this->translate('Full name'))
如何在替换文本后添加第二个大括号?
答案1
尝试使用这个:
sed 's@__esct(\(.*)\)@$this->escape($this->translate(\1)@' file.txt
答案2
sed -e 's/__esct(\(.*\))/$this->escape($this->translate(\1))/'
应该能让你走得很远。如果你有的话它会失败foo(__esct('Some text'))
sed -e 's/__esct(\([^(]*\))/$this->escape($this->translate(\1))/'
这个对那些人有用,但对那些人却失败了__esct(foo('Some text'))
答案3
Perl 有很好的扩展来完成类似的事情:
perl -pi -e 's;__esct\(\'([a-zA-Z ]*)\'\);\$this->escape\(\$this->translate\(\'\1\'));g' list of the files to mangle
它将把原始文件保留为<文件>.bak。这只是每行的全局替换,就像您在 vi(1) 中编写的那样。在 Perl 中,() 等都是元字符,要匹配它们,您需要 \( \)。
[我不能 100% 确定 ' 的处理,需要检查您的特定 shell 在这种情况下会做什么。]