使用sed在Linux中拆分或连接行

时间:2018-02-13 01:03:03

标签: linux bash sed tr

我的文件包含以下信息

$ cat test.txt 
Studentename:Ram
rollno:12
subjects:6
Highest:95
Lowest:65
Studentename:Krish
rollno:13
subjects:6
Highest:90
Lowest:45
Studentename:Sam
rollno:14
subjects:6
Highest:75
Lowest:65

我正在尝试单身学生的地方信息。 即我的输出应该是

Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65.

以下是我写的命令

cat test.txt | tr "\n" " " | sed 's/Lowest:[0-9]\+/Lowest:[0:9]\n/g'

以上命令在正则表达式中断行最低:[0-9]但它不打印图案。相反,它打印最低:[0-9]。

请帮忙

4 个答案:

答案 0 :(得分:2)

使用

尝试此操作
awk '{if ($1 !~ /^Lowest/) {printf "%s ", $0} else {print}}' file.txt

或更短但更混淆:

awk '$1!~/^Lowest/{printf"%s ",$0;next}1' file.txt

或者纠正你的命令:

tr "\n" " " < file.txt | sed 's/Lowest:[0-9]\+/&\n/g'

说明:&在替换的左侧部分匹配

答案 1 :(得分:2)

尝试:

$ sed '/^Studente/{:a; N; /Lowest/!ba; s/\n/ /g}' test.txt
Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65

如何运作

/^Studente/{...}告诉sed仅在以Studente开头的行上执行花括号内的命令。这些命令是:

  • :a

    这定义了标签a

  • N

    这将读取下一行并将其附加到模式空间。

  • /Lowest/!ba

    如果当前模式空间不包含Lowest,则告诉sed返回标签a

    更详细地说,如果该行包含/Lowest/,则Lowest为真。在sed中,!为否定因此/Lowest/! is true if the line does not contain最低. In ba , the b stands for the branch command and a`是要分支的标签。

  • s/\n/ /g

    这告诉sed用空格替换所有换行符。

答案 2 :(得分:2)

另一个不假设最低GNU sed是最后一项:

sed ':a; N; /\nStudent/{P; D}; s/\n/ /; ba' test.txt

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '/^Studentename:/{:a;x;s/\n/ /gp;d};H;$ba;d' file

使用保留空间收集字段,然后删除换行符以生成记录。