将以#开头的行移至下一行的末尾。首选AWK或SED

时间:2013-10-15 09:16:58

标签: 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.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在$字符
  3. 之间切换所有内容

    有任何建议如何让它变得更好(表现和看起来)?

    由于

2 个答案:

答案 0 :(得分:4)

  

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

试试这一行:

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 :(得分:1)

这可能适合你(GNU sed):

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

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

相关问题