首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tr '\n\t+‘命令在shell bash中不起作用?

tr '\n\t+‘命令在shell bash中不起作用?
EN

Stack Overflow用户
提问于 2014-07-02 14:35:40
回答 1查看 501关注 0票数 0
代码语言:javascript
复制
Text1  Text2
(3 tabs)  text 3
(4 tabs)  text 4
 (2 tabs) text 5
Text2 Text7
(2 tabs) Text8  

我有一个以上格式的文本文件。基本上,我想做的是,我想用一个特殊的字符替换连续的换行符和制表符。我正在使用以下命令

代码语言:javascript
复制
tr '\n\t+' '@'

我期待着这个输出

代码语言:javascript
复制
Text1 Text2@text 3@text 4@text 5<br/>
Text2 Text7@Text8

这个regex可以很好地处理eclipse和replace (也可以使用editplus)。然而,tr将所有内容放在一行中。

有人能告诉我tr有什么问题吗,这个正则表达式?那么,决议是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 15:45:52

@anubhava's helpful answer解释了为什么tr在这里不能工作,但是纯sed解决方案有一个小小的缺点(除了有点难以理解):在执行所需的字符串替换之前,它会将整个输入文件读入内存(对于较小的文件来说,这可能非常好)。

如果你:

  • 有GNU awkmawk
  • 别介意把awksed结合起来

下面是一个解决方案,它不会同时读取整个输入,

代码语言:javascript
复制
awk -v RS='\n\t+' -v ORS=@  '1' file | sed '$d'
  • -v RS='\n\t+'将输入记录分隔符RS分配给输入记录分隔符,该分隔符将输入(可能跨行)分割为基于分隔换行符的记录,后面至少有一个空格。请注意,使用regex作为记录分隔符不符合POSIX,因此需要GNU、awkmawk
  • -v ORS=@@分配给变量ORS (输出记录分隔符)。
  • 在这种情况下,1构成了整个awk程序:它是一个与{print}实际上相同的通用快捷方式,也就是说,它只是输出每个输入记录,然后是输出记录分隔符ORS
  • 但是,由于每条记录(包括最后一条记录)都是用ORS终止的,所以我们在输出的末尾以\n@结束,这是不需要的。
  • sed '$d'只是从输出中删除最后一行($与最后一行匹配,d删除它)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24533941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档