Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 用多个字符替换新行_Shell_Tr_Fish - Fatal编程技术网

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我可能会使用一个变量将前缀单独添加到第一行,以跟踪它是新行还是前一行的延续(即,如果前一个输入没有以新行结束)。