好的,所以我知道替换换行的最佳方法通常是做tr '\n' ' '
或类似的东西,但这只适用于单个角色。
我想做的是替换新行,但插入的内容超过单个字符;在我的情况下,我实际上想要添加一个时间戳,以便像这样:
foo
bar
变成这样的东西:
[11:30] foo
[11:30] bar
我需要能够通过替换新行字符本身来做到这一点,因为我无法保证在处理它时输入的最后一行是完整的(例如 - 它可以输出来自printf '%s' "foo"
,所以还没有行结束。这意味着逐行使用read
并仅使用时间戳回显并不是一个选项。
答案 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(fish)显示"⏎"字符表示没有结束换行符。
答案 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,这可以避免使用其他程序。