我想在目录层次结构中的多个文件中进行字符串操作。
我基本上有一个带.m文件的项目目录,我想查看所有文件;找到NSLocalizedString的所有实例(键,注释)并将其更改为NSLocalizedStringFromTable(键,表,注释)。
简单查找&替换无法正常工作,因为我需要在其间插入“表格”,我无法手动执行此操作,因为项目中至少有1200个此类实例。
我猜这个逻辑会是这样的:
循环遍历目录结构以查找所有.m文件
查找“NSLocalizedString”的所有实例
复制变量var1&中的“key”和“comment”。 var 2
用NSLocalizedStringFromTable(var1,table,var2)替换NSLocalizedString(key,comment)
保存文件(不替换,保存)
那么如何编写脚本来执行此操作?
答案 0 :(得分:1)
由于这是一个Cocoa项目,为什么不能在IDE中使用项目范围的查找和替换(⌘⌥⇧F)?这就是它的用途。
答案 1 :(得分:1)
如果您在包含这些文件的目录中打开终端cd
,我发现这是找到这些文件的最佳选择:
find . -type f -name "*.m*" -print
这将查找当前.
目录中名称为-type f
,*.m
,*.mm
等文件*.mmmmm
的所有内容({ {1}})。然后,将每个结果文件*.m*
输出到控制台(或管道)。如果您希望将每个文件传递给另一个进程(使用-print
),最好将xargs
替换为-print
,以便正确处理文件名中的空格。< / p>
接下来,使用-print0
替换这些结果中的文本。 (Mac附带的sed
版本与GNU sed
不同,并且无法正确处理换行符和其他特殊字符。如果这对您不起作用,可能需要获取该版本。)
替换的基本结构是:
sed
sed -i "" -e 's/NSLocalizedString(\(.*\), \(.*\))/NSLocalizedStringFromTable(\1, table, \2)/g' "FILENAME"
就地替换文件(将其保存到打开的同一文件中)。 -i ""
只是意味着下一个文本将成为一个表达式。使用-e
启动表达式表示您将进行搜索和替换。它通常采用以下格式:
s/
最后的s/[search for this pattern]/[replace with this pattern]/g
表示“全局”,或“为尽可能多的每个行上的实例执行此操作。”
搜索模式/g
找到该文本,然后复制/NSLocalizedString(\(.*\), \(.*\))/
标记的内容(您必须转义括号,以便\(...\)
知道记住它。)
替换模式sed
将/NSLocalizedStringFromTable(\1, table, \2)/
替换为NSLocalizedString
,然后将第一个和第二个NSLocalizedStringFromTable
对的确切替换隐藏到\(.*\)
中}和\1
引用。
如果您有这个字面值:
\2
然后结果将成为:
NSLocalizedString(@"Darn tootin'", @"How they say 'that is correct' in some dialects");
现在,@ sehellter在评论中询问你是否意味着你想要文字
在那里,参数1或参数2应该来自不同的表,等等。这肯定会改变格式这个搜索字符串。NSLocalizedStringFromTable(@"Darn tootin'", table, @"How they say 'that is correct' in some dialects");
最后,您可以将上述两个功能组合到一个长shell脚本中并在终端中运行它:
table
如果您想要使用不同的值代替原始帖子中提到的“var1”和“var2”,则需要指定。
答案 2 :(得分:0)
您需要发布一些示例以了解要替换的模式,但这似乎是一个简单的问题。意识到你可以使用["^]*?
停在".
从那里开始,只是将其拆分并重新组合在一起。
一个例子是
'(NSLocalizedString\()("["^]*?)(,)("["^]*?)(\))', '\1\2\3#TABLE#\3\4\5'
此示例将NSLocalizedString("var1", "var2")
作为输入,并将其设为NSLocalizedString("var1", #table#, "var2")
。