1

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

测试文件.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 在角色之间切换一切

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

谢谢

4

2 回答 2

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
于 2013-10-15T09:19:59.247 回答
1

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

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

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

于 2013-10-15T11:05:31.147 回答