sed中的条件分支

sed中的条件分支,sed,Sed,我有一个定义明确的问题,似乎是sed的一个很好的候选人 我的输入文件包含两个令牌之一: [文件]或[行] 结构如下所示: [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

我有一个定义明确的问题,似乎是sed的一个很好的候选人

我的输入文件包含两个令牌之一:

[文件]
[行]

结构如下所示:

[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的新手,我想完全了解你的工作

这可能适合您(GNU-sed):

删除保留最后一行的多行。

这可能适合您(GNU-sed):


删除保留最后一行的多行。

这里是另一个变体:

sed '/LINE/{H;x;:r;n;/LINE/br;x;d};h;d'
它始终保留最后一行,当它看到“line”时,它显示最后一行,然后显示包含“line”的所有后续行,并且该过程递归地重复


它适用于任何可能的sed。

这里是另一个变体:

sed '/LINE/{H;x;:r;n;/LINE/br;x;d};h;d'
它始终保留最后一行,当它看到“line”时,它显示最后一行,然后显示包含“line”的所有后续行,并且该过程递归地重复


它与任何可能的SED一起工作。

中间的冒号语法是什么?我理解分号分隔命令,但我没有看到冒号。在S(earch)命令之后有一个分隔符。通常你可以把它放在“/”,但你可以把任何其他字符。例如,如果搜索表达式包含“/”,那么写s///就很难看。这就是sed允许任何分隔符char的原因。我使用了我认为在给定的情况下看起来最好的字符。引用<代码>信息> <代码> [SED的人不完整]:<代码> s >代码>(作为替代)命令的语法是“代码> S/ReExp/替换/标志< /代码>。
/
字符可以统一替换为任何给定的
s
命令中的任何其他单个字符。啊,对不起:)。其中的冒号插入一个标签“r”(从“repeat”)以跳转到:)。我还以为你会问“search”的冒号呢——我在这里没有直接使用search,而是通过//。:)进行匹配。)谢谢我正在学习sed,这个答案真的帮助我提高了理解力!既然你显然是一个大师,我可以问你为什么使用“X”而不是“G”,因为在这两种用法中,你实际上都不需要在模式空间中保留空格吗?中间的冒号语法是什么?我理解分号分隔命令,但我没有看到冒号。在S(earch)命令之后有一个分隔符。通常你可以把它放在“/”,但你可以把任何其他字符。例如,如果搜索表达式包含“/”,那么写s///就很难看。这就是sed允许任何分隔符char的原因。我使用了我认为在给定的情况下看起来最好的字符。引用<代码>信息> <代码> [SED的人不完整]:<代码> s >代码>(作为替代)命令的语法是“代码> S/ReExp/替换/标志< /代码>。
/
字符可以统一替换为任何给定的
s
命令中的任何其他单个字符。啊,对不起:)。其中的冒号插入一个标签“r”(从“repeat”)以跳转到:)。我还以为你会问“search”的冒号呢——我在这里没有直接使用search,而是通过//。:)进行匹配。)谢谢我正在学习sed,这个答案真的帮助我提高了理解力!既然你显然是一位大师,我可以问你为什么用“x”而不是“g”,因为在这两种用法中,你实际上都不需要在模式空间中保留空间吗?