【问题标题】:Move line starting with # to the end of next line. Preferred AWK or SED将 # 开头的行移动到下一行的末尾。首选 AWK 或 SED
【发布时间】:2013-10-16 07:38:14
【问题描述】:

我需要将从 # 开始的每一行移到下一行的末尾(AWK/SED ?)。

Testfile.txt

# FIRST COMMENT
alias1: john@domain.com, tom@domain.com
alias2: betty@domain.com
# SECOND COMMENT
alias3: anna@domain.com, mark@domain.com
alias4: dan@domain.com

预期输出:

alias1: john@domain.com, tom@domain.com # FIRST COMMENT
alias2: betty@domain.com
alias3: anna@domain.com, mark@domain.com # SECOND COMMENT
alias4: dan@domain.com

我设法做到了这一点(但我确信这不是最好的解决方案):

sed '/^#/ N;s/\n/$/' testfile.txt | sed -e 's/\(.*\)$\(.*\)/\2 \1/

  1. 第一个 SED 合并行与下一个使用 $ 分隔符。
  2. 第二次 SED 在$ 字符之间切换所有内容

有什么建议可以让它变得更好(性能和外观)?

谢谢

【问题讨论】:

    标签: sed awk merge match lines


    【解决方案1】:

    我需要将每一行以#开头的行移到下一行的末尾

    试试这条线:

    awk '/^#/{x=$0;next}{if(x)print $0,x;else print;x=0}' file
    

    awk '/^#/{x=$0;next}{print $0 (x? FS x:"");x=0}' file
    

    用你的例子测试:

    kent$  echo "# FIRST COMMENT
    alias1: john@domain.com, tom@domain.com
    alias2: betty@domain.com
    # SECOND COMMENT
    alias3: anna@domain.com, mark@domain.com
    alias4: dan@domain.com"|awk '/^#/{x=$0;next}{if(x)print $0,x;else print;x=0}'             
    alias1: john@domain.com, tom@domain.com # FIRST COMMENT
    alias2: betty@domain.com
    alias3: anna@domain.com, mark@domain.com # SECOND COMMENT
    alias4: dan@domain.com
    

    【讨论】:

    • 我正要发布相同的答案......但是......我看到了这样一个 +1
    • @mike 由于您是新来的,请记住,如果您的问题已经解决,您可以将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking
    • 你能解释一下第一个例子是什么吗?我的意思是在将带有哈希的行复制到 x 变量并转到下一行之后会发生什么。
    • @mike 如果一行以 # 开头,则将该行保存到 var x 然后我们转到下一行,将 x 附加到该行,然后打印。
    • @Kent 我的意思有点不同,但我自己解决了:如果 x 不等于 0,则打印整行(下一行)并附加 x,否则打印整行(下一行) ,然后在 if 语句之后将 x 设置为 0。:) 顺便说一句。这个解决方案也正确吗? awk '/^#/ { getline t;打印 t,$0;下一个}; 1' testfile.txt
    【解决方案2】:

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

    sed -r '/^#/{$!N;s/(.*)\n(.*)/\2 \1/}'  file
    

    如果该行以散列开头,则附加一个换行符和下一行(除非当前行是文件中的最后一行),然后将该行与当前行交换并在它们之间放置一个空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2015-09-05
      • 2019-06-04
      相关资源
      最近更新 更多