假设我们只想在某些模式之间进行一些替换,让它们成为<a>
并且</a>
为了清楚起见......(好吧,好吧,它们是start
和end
!.. Jeez!)
所以我知道如果start
并且end
总是出现在同一行上该怎么办:只需设计一个适当的正则表达式。
我也知道如果它们保证在不同的行上该怎么办,并且我不关心包含行中的任何内容,end
并且我也可以在包含start
before start
的行中应用所有命令:只需指定地址范围作为/start/,/end/
.
然而,这听起来不是很有用。如果我需要做一个更聪明的工作,例如,在一个{...}
块内引入更改,该怎么办?
我能想到的一件事是在处理之前{
和}
之前中断输入,然后将其重新组合在一起:
sed 's/{\|}/\n/g' input | sed 'main stuff' | sed ':a $!{N;ba}; s/\n\(}\|{\)\n/\1/g'
另一种选择是相反的:
cat input | tr '\n' '#' | sed 'whatever; s/#/\n/g'
这两者都很丑,主要是因为操作并不局限于单个命令。第二个甚至更糟,因为假设原始文本中不存在某些字符或子字符串,则必须使用它作为“换行符”。
那么问题来了:有没有更好的方法或者上述的方法可以优化吗?从我在最近的 SO 问题中读到的内容来看,这是一项相当常规的任务,所以我想一劳永逸地选择最佳实践。
PS我最感兴趣的是纯粹sed
的解决方案:这项工作可以只通过一次调用来完成sed
吗?请不要awk
,Perl
等:这更多是一个理论问题,而不是“需要尽快完成工作”的问题。