假设我们想要在某些模式之间进行替换,比如
如果
如果它们保证在不同的行上,并且我不关心包含
然而,这听起来并不是很有用。如果我需要完成更智能的工作,例如在
我能想到的一件事是,在处理之前按
另一种选择则是相反的:
这两种方法都不太优美,主要是因为操作没有被限制在一个单一的命令中。第二个方法更糟糕,因为必须使用某些字符或子字符串作为“换行符”,假设它不存在于原始文本中。
因此问题是:是否有更好的方法或可以优化上述方法?从我最近在SO问题中阅读到的内容来看,这是一个相当常见的任务,所以我想一劳永逸地选择最佳实践。
附言:我主要对纯sed解决方案感兴趣:能否用一次sed调用完成工作,而无需其他任何东西?请不要使用awk、Perl等:这更多是一个理论问题,而不是一个“需要立即完成工作”的问题。
<a>
和</a>
(为了清晰起见…(好吧,好吧,它们是“start”和“end”!够了!)。如果
start
和end
总是出现在同一行上,那么我知道该怎么做:设计一个合适的正则表达式。如果它们保证在不同的行上,并且我不关心包含
end
的行中的任何内容,并且在start
所在的行上应用所有命令在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问题中阅读到的内容来看,这是一个相当常见的任务,所以我想一劳永逸地选择最佳实践。
附言:我主要对纯sed解决方案感兴趣:能否用一次sed调用完成工作,而无需其他任何东西?请不要使用awk、Perl等:这更多是一个理论问题,而不是一个“需要立即完成工作”的问题。
this \n this that \n this {this is OK} that {this \n must be changed to that \n and that} and that \n {and that \n } \n '
。 - Lev Levitsky\v
是什么意思?这是垂直制表符吗?输入中出现的几率有多大?正如问题所述,我不想用其他字符替换换行符,但也许使用像这样的特殊字符是安全的? - Lev Levitsky\v
可以是任何独特的字符或字符组合,例如s/\n/*NEWLINE*/g ....s/\*NEWLINE\*/\n/g
。请注意,在此独特字符(s)进行测试之前,文件将保持未处理状态,但具有非零退出代码。/\*NEWLINE\*/q1
- potong