仅使用命令行工具在包含字符串/表达式的行上删除换行符

时间:2014-12-05 10:31:44

标签: shell replace sed newline tr

我正在寻找替换\ n字符的最简单方法,但仅限于包含特定表达式的给定行。

输入看起来像这样

00:03:04
text alphabetic abcde
00:03:08
text alphabetic abcde
00:03:17
text alphabetic abcde
00:03:26
text alphabetic abcde

输出就像

00:03:04 text alphabetic abcde
00:03:08 text alphabetic abcde
00:03:17 text alphabetic abcde
00:03:26 text alphabetic abcde

现在我只想在非字母行中替换\ n。

我想最简单的方法是使用'tr',但我看不出如何将其限制为指定的行。

我摆弄了sed,但这看起来很有问题。

我无法相信没有优雅的说法 “在以[0-9] [0-9]开头的行上替换换行符:”。

你会怎么做?

4 个答案:

答案 0 :(得分:1)

你必须使用"保持缓冲区":

~$ sed -r'/[0-9][0-9]:/ {N; s/ *\n/ /}' myfile
00:03:04 text alphabetic abcde
00:03:08 text alphabetic abcde
00:03:17 text alphabetic abcde
00:03:26 text alphabetic abcde

N说:阅读下一行并附加到当前行 然后我们进行替换s/\n/ /(因为在你的例子中你有一些空格,你必须删除它,因此*部分)。
而且,只有当行以/[0-9][0-9]:/

开头时

请注意,如果您的文件严格符合以下格式:

time
text
time
text
...

您不需要/[0-9]/部分:

~$ sed '{N; s/ *\n/ /}' myfile
00:03:04 text alphabetic abcde
00:03:08 text alphabetic abcde
00:03:17 text alphabetic abcde
00:03:26 text alphabetic abcde

答案 1 :(得分:0)

awk应该:

awk 'ORS=NR%2?FS:RS' file
00:03:04 text alphabetic abcde
00:03:08 text alphabetic abcde
00:03:17 text alphabetic abcde
00:03:26 text alphabetic abcde

这会根据行号(奇数/偶数)

更改输出记录选择器

答案 2 :(得分:0)

如果你想加入每一行:

paste -d " " - - < filename

答案 3 :(得分:0)

sed -n '/^[0-9:]*$/!{H;x;s/\n/ /;p;b};h' input

给出:

00:03:04 text alphabetic abcde
00:03:08 text alphabetic abcde
00:03:17 text alphabetic abcde
00:03:26 text alphabetic abcde