【问题标题】:Split or join lines in Linux using sed使用 sed 在 Linux 中拆分或连接行
【发布时间】:2018-07-23 07:17:08
【问题描述】:

我有包含以下信息的文件

$ 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] 处换行,但它不打印模式。相反,它正在打印 Lowest:[0-9]。

请帮忙

【问题讨论】:

  • 输入文件看起来像这样吗?有这样的空行吗???
  • @GillesQuenot 我刚刚删除了空白行,因为根据我的经验,SO 新手需要一段时间才能发现代码格式化按钮:{}。如果我猜错了,希望OP能及时纠正我。
  • 基本上文件确实包含空行

标签: linux bash sed tr


【解决方案1】:

这可能对你有用(GNU sed):

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

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

【讨论】:

    【解决方案2】:

    另一个可能的GNU sed 不假定最低 是最后一项:

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

    【讨论】:

    • 您从我这里得到了 +1,因为您的回答很有创意并且有效,并且由于一些匿名的反对者没有在我们的任何答案上留言,因此不应该得到净负分。
    【解决方案3】:

    使用 试试这个:

    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'
    

    解释:&amp; 是替换左边部分匹配的内容

    【讨论】:

    • 这就是我要找的。我错过了 ”&”。非常感谢
    • 因为您的回答效果很好,而且匿名投票者没有理由拒绝投票:+1。
    【解决方案4】:

    试试:

    $ 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 containLowest. Inba, thebstands for the branch command anda` 是要分支到的标签。

    • s/\n/ /g

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

    【讨论】:

    • 在做条件表达式时,awk 更具可读性:)
    • 感谢您的详细解释。
    • 小心误报。我的名字是Lowest
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多