2011-11-15 51 views
1

我想在目录层次结构中的多个文件中执行字符串操作。Shell脚本循环遍历文件并执行字符串操作

我基本上有一个项目目录与.m文件,我想看看所有的文件;找到NSLocalizedString(key,comment)的所有实例,并将其更改为NSLocalizedStringFromTable(key,table,comment)。

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

的逻辑是这样的我想:

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

  • 找到 “NSLocalizedString” 的所有实例

  • 副本变量var1中的“键”和“注释”var1 & var 2

  • repla CE NSLocalizedString(键,评论)与NSLocalizedStringFromTable(VAR1,表,VAR2)

  • 保存文件(而不是取代它,将它保存)

那么,如何编写脚本来做到这一点?

+2

你的具体编程问题是什么? – Polynomial

+0

我编辑了我的问题到底 – unspokenblabber

+2

这不是一个具体的编程问题。这是要求我们为你写脚本。 StackOverflow是关于解决特定问题,而不是让人们编写代码。 – Polynomial

回答

1

如果打开终端,cd到包含这些文件的目录,我觉得这是最好的找到这些文件:

find . -type f -name "*.m*" -print
此找到当前 .目录是一个文件 -type f具有名称中的一切 *.m, *.mm, *.mmmmm等( *.m*)。然后,您将每个生成的文件 -print输出到控制台(或管道)。如果您希望将每个文件传递给另一个进程(使用 xargs),最好将 -print替换为 -print0,以便正确处理文件名中的空格。

接下来,使用sed替换这些结果中的文本。 (Mac附带的sed版本与GNU 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)/,与NSLocalizedStringFromTable取代NSLocalizedString,然后夹着确切更换所述第一和第二\(.*\)对进入\1\2引用。

如果你有这样的文字值:

NSLocalizedString(@"Darn tootin'", @"How they say 'that is correct' in some dialects");
那么结果会变成:
NSLocalizedStringFromTable(@"Darn tootin'", table, @"How they say 'that is correct' in some dialects");

现在,在评论@shellter询问是否意味着你想要的文字字table是在那里,无论是参数1或参数2应来自不同的表格等。这肯定会改变此搜索字符串的格式。

最后,您可以在终端上面的两个功能结合成一个长的shell脚本并运行它:

 
find . -type f -name "*.m*" -print0| \ 
xargs -0 -I FILENAME \ 
sed -i "" -e 's/NSLocalizedString(\(.*\), \(.*\))/NSLocalizedStringFromTable(\1, table, \2)/g' "FILENAME" 

如果你的意思是不同的值要到位“VAR1”和“VAR2”的你在原始文章中提到,您需要指定。

0

你需要发布几个样本来获得一个想法的模式来取代,但这似乎是一个足够简单的问题。意识到您可以使用​​停止在".从那里它只是适当地分手并将其放回到一起。

一个例子是

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

本例将NSLocalizedString("var1", "var2")作为输入,并使得它NSLocalizedString("var1", #table#, "var2")

+0

我会试试这个。我很抱歉无法提供任何示例,因为我对Shell脚本是全新的,因此不想通过发布错误示例来混淆读者。 – unspokenblabber

+0

理想情况下,正则表达式你想知道你有什么,从那里你可以做任何事情。 – AndrewHodge

1

既然这是一个Cocoa项目,为什么不能在IDE中使用项目范围的查找和替换(⌘⌥⇧F)呢?这是它的用途。

+0

我有1200个NSLocalizedString(键,评论)实例替换NSLocalizedStringFromTable(键,表,评论)和键和评论不应该改变,并插入之间的“表”值。我不认为XCode允许做复杂的替换 – unspokenblabber

相关问题