2012-11-06 54 views
0

我有一個很好定義的問題,似乎是一個很好的候選人sed。有條件的分支在sed

我的輸入文件包含以下兩種標記之一:

[FILE][LINE]

的結構是這樣的:

[FILE]: C:\Users\user\git\build.xml 
[FILE]: C:\Users\user\git\dataload-pom.xml 
[FILE]: C:\Users\user\git\local.properties 
    [LINE]: [job.mail.toAddress=] 
    [LINE]: [log.mail.toAddress=] 
    [LINE]: [log.mail.client.toAddress=] 
    [LINE]: [log.mail.toAddress=] 
    [LINE]: [bill.report.toAddress=] 
[FILE]: C:\Users\user\git\pom.xml 
[FILE]: C:\Users\user\git\release.properties 
    [LINE]: [job.mail.toAddress=] 
    [LINE]: [log.mail.client.toAddress=] 

預期結果將是:

[FILE]: C:\Users\user\git\local.properties 
    [LINE]: [job.mail.toAddress=] 
    [LINE]: [log.mail.toAddress=] 
    [LINE]: [log.mail.client.toAddress=] 
    [LINE]: [log.mail.toAddress=] 
    [LINE]: [bill.report.toAddress=] 
[FILE]: C:\Users\user\git\release.properties 
    [LINE]: [job.mail.toAddress=] 
    [LINE]: [log.mail.client.toAddress=] 

我只想看看filena mes如果他們有與他們相關的線。我是嶄新的品牌屁股,並希望完全瞭解你的工作。

回答

3

下面是另一種變體:

sed '/LINE/{H;x;:r;n;/LINE/br;x;d};h;d' 

它使最後一行所有的時間,和當它看到「線,它顯示的最後一行,則顯示包含所有以下行」線,並且處理如此遞歸地重複。

它適用於任何可能的sed。

+0

什麼是中間的冒號語法...我理解分號分隔命令,但我沒有看到冒號。 – avgvstvs

+0

S(earch)命令後面有一個分隔符。通常你可以放'/',但你可以放任何其他角色。例如,如果搜索表達式包含'/',寫入s ///就很難看。這就是爲什麼sed允許任何分隔字符。我使用那個字符,我認爲在給定情況下看起來最好。從'信息sed' – alinsoar

+0

引用[sed的男人不完整]: 的's'的語法(如在替代)命令是 'S/REGEXP /更換/ FLAGS'。在任何給定的's'命令中'/'字符可以被任何其他單個字符統一地替換爲 。 – alinsoar

3

這可能爲你工作(GNU SED):

sed '$!N;/^\(\[FILE\]\).*\n\1/!P;D' file 

刪除多個[FILE]行保留最後一次。