【问题标题】:How to separate an array into multiple lines with sed如何使用 sed 将数组分成多行
【发布时间】:2018-01-18 05:45:05
【问题描述】:

我有一个像这样的 txt 数据:

A B [C,D,E] [F,G]

想要将结果输出为:

A B C F \n
A B C G \n
A B D F \n
A B D G \n
A B E F \n
A B E G \n

如何使用sed 命令来执行此操作?

【问题讨论】:

  • 展示你的努力(代码)...?为什么是 sed 而不是,例如 Python?
  • pure sed 中这样做会很困难。 Pity SE Code Golf 不喜欢单一语言的问题。
  • 我很确定这是一个现有问题的副本,但我找不到比stackoverflow.com/questions/45789937/… 上的 Python 答案更好的答案
  • @agc 有一些例外,例如,生命游戏。

标签: shell sed


【解决方案1】:

如果您想使用sedawk 将您的字符串“按摩” 变成这种形式:

"A B" ::: C D E ::: F G

您可以让 GNU Parallel 为您进行排列:

parallel -k echo ::: "A B" ::: C D E ::: F G

输出

A B C F
A B C G
A B D F
A B D G
A B E F
A B E G

没有人说答案必须是完整的,它们可能只是有帮助的,也可能是片面的。也许您或其他人想要添加必要的“按摩”

【讨论】:

  • 很好,我喜欢它+1
  • 这行得通:sed 'y/ []/,::/;s/:,//;s/^\([^:]*\),/"\1"/;s/:/ ::: /g;y/,/ /;s/[ :]*$//' <<< 'A B [C,D,E] [F,G]' | xargs parallel -k echo :::
  • @agc 酷,把它作为一个答案让所有人看到并炫耀你的sed 技能。或者,如果您愿意,可以将其编辑到我的答案中。我不认为 SO 是一种竞争,而是一种出色的资源,所以我不担心任何点,这里的好信息越多越好!
  • @MarkSetchell,和a new answer一起去了,(花了一些草稿才削减)。
【解决方案2】:

如果您接受sed 以外的其他解决方案,您可以使用单行awk 解决方案:

echo A B [C,D,E] [F,G] | awk '{a=$1; b=$2; tmp1=$3; tmp2=$4}END{split(substr(tmp1,2,length(tmp1)-2),arr1,","); split(substr(tmp2,2,length(tmp2)-2),arr2,","); for(i in arr1){for(j in arr2){print a" "b" "arr1[i]" "arr2[j]" \\n"}}}'

输出:

A B C F \n
A B C G \n
A B D F \n
A B D G \n
A B E F \n
A B E G \n

如果您不需要在每行末尾显示\n,则可以删除" \\n"

【讨论】:

    【解决方案3】:

    假设 输入文件 包含:

    A B [C,D,E] [F,G]
    A B C [D,E] [M,N]
    

    使用sed 将它们解析成parallel 喜欢的形式,(方法从Mark Setchell's answer 借用),一次一行:

    sed 's/ \[\|\] \[/ ::: /g;y/,]/  /;s/^/"/;s/ :/" :/;s/ $//' inputfile | 
    xargs -L 1 parallel -k echo :::
    

    输出:

    A B C F
    A B C G
    A B D F
    A B D G
    A B E F
    A B E G
    A B C D M
    A B C D N
    A B C E M
    A B C E N
    

    注意事项:

    • sed 代码不是最优的。
    • 略读man parallel 中的示例表明可以用一些额外的parallel 魔法替换xargs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多