如何获取所有收到的文字' number:number'与前面的'相同的行:number'?
10:15
text line one
text line two
text no pattern
11:12
random text
text is random
totally random
could be four lines
could be five
应该成为
10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five
答案 0 :(得分:2)
这适用于您的示例 -
tr '\n' ' ' < file.txt | sed 's/[0-9]*:[0-9]*/\n&/g'
解释 -
tr最初会将所有内容放在同一行。
然后,sed one liner将在每个num:num模式之前插入新行。
答案 1 :(得分:2)
鉴于输入文件,您需要的是告诉awk使用RS=<null>
一次读取一个空行分隔的段落,并使用空白字符的默认OFS
值重新编译每个记录/ p>
$ awk -v RS= '{$1=$1}1' file
10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five
答案 2 :(得分:1)
sed和awk解决方案都会加入行,直到检测到新记录或输入完成,在这种情况下打印并清除连接的行 - 使用任一解决方案
sed oneliner
sed -nr '/^[0-9]{2}:[0-9]{2}$/!{H;$!b}; x; s/\n/ /gp'
awk脚本
awk '
!/^[0-9]{2}:[0-9]{2}$/ {
lines=lines" "$0
next
}
{if(lines) print lines; lines=$0}
END {print lines}
'
答案 3 :(得分:0)
这是一个GNU AWK脚本:
<强> script.awk 强>
BEGIN { RS = "\n[0-9]+:[0-9]+|\n$" }
{ gsub(/\n/,"",$0)
printf( "%s%s ", $0,RT) }
像awk -f script.awk file.txt
它使用GNU AWK特定扩展RT
和正则表达式RS
:
$0
中,而不在RT
。答案 4 :(得分:0)
这里的诀窍是你想要在段落而不是行上拆分文件。在awk中,如果设置RS =“”,则启用段落模式。 awk循环的每次迭代都会有一个$ 0的段落。然后,您可以替换换行符并将其转换为空格。
awk <data.txt 'BEGIN { RS = "" ; FS = "\n" } { gsub(/\n/, " ", $0) ; print }'
输出:
10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five
这样做的好处是awk会为你处理所有特殊情况:以空白行结尾的文件,没有空白行结束,没有换行符结束的文件等等。