Shell 用多个字符替换新行
好的,所以我知道替换新行的最佳方法通常是执行类似于Shell 用多个字符替换新行,shell,tr,fish,Shell,Tr,Fish,好的,所以我知道替换新行的最佳方法通常是执行类似于tr'\n'或类似的操作,但是这只适用于单个字符 我想做的是替换新行,但插入比单个字符更长的内容;在我的例子中,我实际上想添加一个时间戳,这样: foo bar [11:30] foo [11:30] bar 变成这样: foo bar [11:30] foo [11:30] bar 我需要通过替换新行字符本身来做到这一点,因为我不能保证最后一行输入将在我处理它时完成(例如,它可能是从printf“%s”的“foo”输出的,因此还没有行结
tr'\n'
或类似的操作,但是这只适用于单个字符
我想做的是替换新行,但插入比单个字符更长的内容;在我的例子中,我实际上想添加一个时间戳,这样:
foo
bar
[11:30] foo
[11:30] bar
变成这样:
foo
bar
[11:30] foo
[11:30] bar
我需要通过替换新行字符本身来做到这一点,因为我不能保证最后一行输入将在我处理它时完成(例如,它可能是从
printf“%s”的“foo”
输出的,因此还没有行结束)。这意味着使用read
逐行读取,并且只回显添加的时间戳是不可取的。这是一个没有尾随换行符的文件:
$ 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⏎
My shell()显示“⏎" 字符来表示没有结束的换行符。我找到了一个特定于bash的替代方法,所以我想我会将它显示为那些使用
bash
shell的人的替代答案(这是大多数人,除了那些目前正在遭受shell冲击的人;)
glenn jackman关于使用
perl
的建议对于具有其他shell的系统来说可能更具可移植性,但对于bash来说,这避免了使用另一个程序。但是第一行没有时间戳?sed的/^/[11:30]/'file
将在缺少换行符的情况下添加最后一行。@tripleee我可能会使用一个变量将前缀单独添加到第一行,以跟踪它是新行还是前一行的延续(即,如果前一个输入没有以新行结束)。