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

标签 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'

以上命令在正则表达式 Lowest:[0-9] 处换行,但它不打印模式。相反,它正在打印最低:[0-9]。

请帮忙

最佳答案

尝试:

$ 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/!如果该行不包含 Lowest,则为真。在ba中,b代表分支命令,a`是分支到的标签。

  • s/\n//g

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

关于linux - 使用 sed 在 Linux 中拆分或连接行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758004/

相关文章:

bash - 使用嵌套的 for 循环 bash

bash - 替换除字母以外的所有内容

css - 修复 Sass/SCSS 括号缩进

python - 设计多进程守护进程

c - 使用C获取文件名列表并将它们存储在Linux上的数组中

c++ - localhost 套接字是否需要任何类型的 keepalive?

linux - 在 VM 中使用 Invoke-AzVMRunCommand 运行脚本吗?传递参数问题

linux - awk 打印以正则表达式开头的行(IP 地址)

linux - 智能 shell 脚本,用于搜索文件名中的文本并进行错误处理

bash - 找到匹配项后如何添加换行符