Shell脚本循环遍历文件并执行字符串操作

时间:2011-11-15 16:25:07

标签: regex string shell find

我想在目录层次结构中的多个文件中进行字符串操作。

我基本上有一个带.m文件的项目目录,我想查看所有文件;找到NSLocalizedString的所有实例(键,注释)并将其更改为NSLocalizedStringFromTable(键,表,注释)。

简单查找&替换无法正常工作,因为我需要在其间插入“表格”,我无法手动执行此操作,因为项目中至少有1200个此类实例。

我猜这个逻辑会是这样的:

  • 循环遍历目录结构以查找所有.m文件

  • 查找“NSLocalizedString”的所有实例

  • 复制变量var1&中的“key”和“comment”。 var 2

  • 用NSLocalizedStringFromTable(var1,table,var2)替换NSLocalizedString(key,comment)

  • 保存文件(不替换,保存)

那么如何编写脚本来执行此操作?

3 个答案:

答案 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在评论中询问你是否意味着你想要文字

NSLocalizedStringFromTable(@"Darn tootin'", table, @"How they say 'that is correct' in some dialects");
在那里,参数1或参数2应该来自不同的表,等等。这肯定会改变格式这个搜索字符串。

最后,您可以将上述两个功能组合到一个长shell脚本中并在终端中运行它: table

如果您想要使用不同的值代替原始帖子中提到的“var1”和“var2”,则需要指定。

答案 2 :(得分:0)

您需要发布一些示例以了解要替换的模式,但这似乎是一个简单的问题。意识到你可以使用["^]*?停在".从那里开始,只是将其拆分并重新组合在一起。

一个例子是

'(NSLocalizedString\()("["^]*?)(,)("["^]*?)(\))', '\1\2\3#TABLE#\3\4\5'

此示例将NSLocalizedString("var1", "var2")作为输入,并将其设为NSLocalizedString("var1", #table#, "var2")