Text1 Text2
(3 tabs) text 3
(4 tabs) text 4
(2 tabs) text 5
Text2 Text7
(2 tabs) Text8 我有一个以上格式的文本文件。基本上,我想做的是,我想用一个特殊的字符替换连续的换行符和制表符。我正在使用以下命令
tr '\n\t+' '@'我期待着这个输出
Text1 Text2@text 3@text 4@text 5<br/>
Text2 Text7@Text8这个regex可以很好地处理eclipse和replace (也可以使用editplus)。然而,tr将所有内容放在一行中。
有人能告诉我tr有什么问题吗,这个正则表达式?那么,决议是什么?
发布于 2014-07-02 15:45:52
@anubhava's helpful answer解释了为什么tr在这里不能工作,但是纯sed解决方案有一个小小的缺点(除了有点难以理解):在执行所需的字符串替换之前,它会将整个输入文件读入内存(对于较小的文件来说,这可能非常好)。
如果你:
awk或mawkawk和sed结合起来下面是一个解决方案,它不会同时读取整个输入,
awk -v RS='\n\t+' -v ORS=@ '1' file | sed '$d'-v RS='\n\t+'将输入记录分隔符RS分配给输入记录分隔符,该分隔符将输入(可能跨行)分割为基于分隔换行符的记录,后面至少有一个空格。请注意,使用regex作为记录分隔符不符合POSIX,因此需要GNU、awk或mawk。-v ORS=@将@分配给变量ORS (输出记录分隔符)。1构成了整个awk程序:它是一个与{print}实际上相同的通用快捷方式,也就是说,它只是输出每个输入记录,然后是输出记录分隔符ORS。ORS终止的,所以我们在输出的末尾以\n@结束,这是不需要的。sed '$d'只是从输出中删除最后一行($与最后一行匹配,d删除它)。https://stackoverflow.com/questions/24533941
复制相似问题