用多个字符替换换行符

时间:2014-09-29 10:34:08

标签: shell tr

好的,所以我知道替换换行的最佳方法通常是做tr '\n' ' '或类似的东西,但这只适用于单个角色。

我想做的是替换新行,但插入的内容超过单个字符;在我的情况下,我实际上想要添加一个时间戳,以便像这样:

foo
bar

变成这样的东西:

[11:30] foo
[11:30] bar

我需要能够通过替换新行字符本身来做到这一点,因为我无法保证在处理它时输入的最后一行是完整的(例如 - 它可以输出来自printf '%s' "foo",所以还没有行结束。这意味着逐行使用read并仅使用时间戳回显并不是一个选项。

2 个答案:

答案 0 :(得分:2)

Perl对此有好处。这是一个没有尾随换行符的文件:

$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n   l   a   s   t
0000020       l   i   n   e   ,       n   o       n   e   w   l   i   n
0000040   e
0000041
$ perl -0777 -MTime::Piece -pe 's/^/ (localtime)->strftime("[%H:%M] ") /mge' file
[08:39] line1
[08:39] line2
[08:39] last line, no newline⏎

我的shell()显示"⏎"字符表示没有结束换行符。

答案 1 :(得分:0)

我找到了一个特定于bash的替代方案,所以我想我会把它作为一个替代答案给那些有bash shell的人(大多数人,除了那些目前遭受贝壳冲击的人;)

#!/bin/bash
NL=$'\n'
data="foo${NL}bar"
printf '%s' "[11:30] ${data//$NL/$NL[11:30] }"

glenn jackman建议使用perl对于具有其他shell的系统可能更具可移植性,但对于bash,这可以避免使用其他程序。