我有一个明确定义的问题,似乎是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的新品牌,想要完全理解你的所作所为。
答案 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。