【问题标题】:Reorder lines with a specific pattern in a text file在文本文件中重新排序具有特定模式的行
【发布时间】:2013-06-20 09:05:06
【问题描述】:

我有一个类似这样的文件:

{{}} line 1
{{}} line 2
line 3
line 4
{{}} line 5
line 6

我想要做的是将文件的最后一行以{{}} 为前缀移动到倒数第二行{{}} 之后,所以最终结果是:

{{}} line 1
{{}} line 2
{{}} line 5
line 3
line 4
line 6

它必须是bash(调用sedperlhead 或其他命令都可以)。

【问题讨论】:

    标签: regex perl sed awk pattern-matching


    【解决方案1】:

    如果行以{{}}开头,则打印,否则保存以备后用,

    perl -ne 'if (/^\Q{{}}/) {print}else{push @r,$_} }{print @r' file
    

    【讨论】:

    • 它可以将它们分组,但是它将带有前缀的文件移动到文件末尾。我怎样才能让它们保持在顶部?
    • 你有什么,顶部或底部带有{{}}的行?
    • 我需要将带有{{}} 的行分组在顶部。该命令似乎将它们分组在底部。
    • @user137369 它似乎确实像您预期的结果一样工作,即顶部的组{{}}。您的样本数据是否真实代表了您的实际数据?
    • @user137369 如果要反转“组”,请将if 替换为unless
    【解决方案2】:

    awk 的一种方式:

    awk '$1!="{{}}"{move[++i]=$0;next}1 END{for(x=1;x<=length(move);x++)print move[x]}' file
    

    【讨论】:

    • @user137369 不客气。您可以进一步缩短为:awk '$1!="{{}}"{move[++i]=$0;next}1 END{for(;x&lt;length(move);)print move[++x]}' file
    【解决方案3】:

    GNU 代码

    sed -n 's/^\({{}}\)/\1/p;tk;H;:k;${x;s/\n//;p};d' file
    

    $猫文件 {{}} 第 1 行 {{}} 第 2 行 3号线 第 4 行 {{}} 第 5 行 第 6 行 $sed -n 's/^\({{}}\)/\1/p;tk;H;:k;${x;s/\n//;p};d' 文件 {{}} 第 1 行 {{}} 第 2 行 {{}} 第 5 行 3号线 第 4 行 第 6 行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2022-08-05
      • 2018-07-25
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多