将以#开始的行移动到下一行的末尾。首选AWK或SED

将以#开始的行移动到下一行的末尾。首选AWK或SED,sed,awk,merge,match,lines,Sed,Awk,Merge,Match,Lines,我需要将从#开始的每一行移动到下一行的末尾(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

我需要将从#开始的每一行移动到下一行的末尾(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/

  • 第一个SED合并行与下一个SED合并行使用
    $
    分隔符
  • 第二个SED在
    $
    字符之间切换所有内容
  • 有什么建议可以让它变得更好(性能和外观)

    谢谢

    我需要把从#开始的每一行移到下一行的末尾

    试试这句话:

    awk '/^#/{x=$0;next}{if(x)print $0,x;else print;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
    
    我需要把从#开始的每一行移到下一行的末尾

    试试这句话:

    awk '/^#/{x=$0;next}{if(x)print $0,x;else print;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
    
    这可能适用于您(GNU-sed):

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

    这可能适用于您(GNU-sed):


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

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