我的文件包含以下信息
$ 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]。
请帮忙
答案 0 :(得分:2)
使用awk:
尝试此操作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
使用保留空间收集字段,然后删除换行符以生成记录。