sed中的条件分支

时间:2012-11-06 18:20:10

标签: 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=]

我只想查看文件名是否有与之关联的行。我是sed的新品牌,想要完全理解你的所作所为。

2 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

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

删除保留最后一行的多个[FILE]行。

答案 1 :(得分:3)

这是另一种变体:

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

它始终保留最后一行,当它看到'LINE时,它显示最后一行,然后显示包含'LINE的所有后续行,并且该过程以递归方式重复。

适用于任何可能的sed。