2011-11-15 89 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

相關問題