Shell 如何使用sed将数组分隔为多行

Shell 如何使用sed将数组分隔为多行,shell,sed,Shell,Sed,我有一个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或awk将字符串“按摩”成以下形式: "A B" ::: C D E ::: F G 您可以使用GNU Parallel进行排列: parallel -k echo ::: "A B" ::: C D E ::: F G 输出

我有一个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
awk
将字符串“按摩”成以下形式:

"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

没有人说答案必须是完整的,它们可能只是有用的,或者是部分的。可能您或其他人想要添加必要的“按摩”。

如果您想使用
sed
awk
将您的字符串“按摩”成以下形式:

"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

没有人说答案必须是完整的,它们可能只是有用的,或者是部分的。可能您或其他人想要添加必要的“按摩”。

如果您接受除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”
,如果您接受除
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”
,假设输入文件包含:

A B [C,D,E] [F,G]
A B C [D,E] [M,N]
使用
sed
将它们解析为
parallel
喜欢的形式(借用的方法),一次一行:

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
    代码不是最佳的
  • 浏览一下
    manparallel
    中的示例,就可以用一些额外的
    parallel
    魔术来取代
    xargs
假设输入文件包含:

A B [C,D,E] [F,G]
A B C [D,E] [M,N]
使用
sed
将它们解析为
parallel
喜欢的形式(借用的方法),一次一行:

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
    代码不是最佳的
  • 浏览一下
    manparallel
    中的示例,就可以用一些额外的
    parallel
    魔术来取代
    xargs

展示你的努力(代码)。。。?为什么是
sed
而不是Python呢?在纯
sed
中这样做会很困难。遗憾的是,SE Code Golf不喜欢单一语言的问题。我很确定这是一个与现有问题重复的问题,但我无法很快在@agc找到比Python更好的答案。有一些例外,例如《生活游戏》。同样相关的:展示你的努力(代码)。。。?为什么是
sed
而不是Python呢?在纯
sed
中这样做会很困难。遗憾的是,SE Code Golf不喜欢单一语言的问题。我很确定这是一个与现有问题重复的问题,但我很快在@agc上找到了比Python更好的答案。有一些例外,例如《生活的游戏》。同样相关:尼斯我爱它+1此作品:sed'y/[],:/;s/:,/;s/^\([^::*\),/“\1/;s/:/::/g;y/,/;s/[:]*$/'@agc Cool,把它作为一个答案,让所有人看到并展示你的
sed
技能。如果你愿意,也可以把它编辑成我的答案。我不认为这是一种竞争,而是一种卓越的资源,所以我不担心任何分数,这里的信息越多越好@MarkSetchell(这需要一些草稿才能删减)很好我喜欢它+1这部作品:
sed'y/[]/,:/;s/:,/;s/^\([^::*\),/“\1/;s/:/::/g;y/,/;s/[:]*$/'@agc Cool,把它作为一个答案,让所有人看到并展示你的
sed
技能。如果你愿意,也可以把它编辑成我的答案。我不认为这是一种竞争,而是一种卓越的资源,所以我不担心任何分数,这里的信息越多越好@马克·塞切尔(MarkSetchell)也跟着去了,(这需要几张草稿才能删减)。