在bash中,如何生成所有可能的单词组合,但是按原始顺序排列?

时间:2017-04-13 06:14:34

标签: bash sh

从行:

word1 word2 word3 word4 word5 word6

如何返回以下内容:

word1
word2
word3
word4
word5
word6
word1 word2
word2 word3
word3 word4
word4 word5
word5 word6
word1 word2 word3
word2 word3 word4
word3 word4 word5
word4 word5 word6
word1 word2 word3 word4
word2 word3 word4 word5
word3 word4 word5 word6
word1 word2 word3 word4 word5
word2 word3 word4 word5 word6
word1 word2 word3 word4 word5 word6

因为知识有限,我以前一个接一个地做这个,但如果这行包含很多单词,我必须输入数百行。所以请帮助我。

3 个答案:

答案 0 :(得分:3)

您要求»给定字符串的所有子字符串,而不分割字«或»数组的所有子数组«。

bash解决方案

#! /bin/bash

array=(word1 word2 word3 word4 word5 word6)

for (( length=1; length <= "${#array[@]}"; ++length )); do
    for (( start=0; start + length <= "${#array[@]}"; ++start )); do
        echo "${array[@]:start:length}"
    done
done

sh解决方案

由于mklement0更好sh-solution而被删除。

答案 1 :(得分:1)

Socowi's helpful answer提供优雅的bash解决方案 [1]

使用便携,高效的sh实现来补充它,它还可以处理输入字之间的可变数量的空格(和/或制表符):

#!/bin/sh

# Input string.
string='word1 word2 word3 word4 word5 word6'

# Compress runs of multiple spaces (and/or tabs) between words, if any,
# to a single space.
string=$(printf '%s\n' "$string" | tr -s '[:blank:]' ' ')

# Count the number of words in the string.
# Note: On BSD/macOS, the result will have leading whitespace,
#       but with operators such as `-le` inside `[ ... ]` and with
#       *unquoted* references inside $(( ... )) that is not a problem.
wordCount=$(printf '%s\n' "$string" | wc -w)

start=1
while [ $start -le $wordCount ]; do
  end=$start
  while [ $end -le $wordCount ]; do
    printf '%s\n' "$string" | cut -d ' ' -f "$start-$end"
    end=$(( end + 1 ))
  done
  start=$(( start + 1 ))
done

[1]在bash中,只要您将引用应用于元素,就可以将字符串拆分为带有文字的数组元素根据需要: 因此array=( word1 word2 word3 word4 word5 word6 )功能强大(元素不需要引用),但array=( $str ) 通常不健全,因为$str扩展到的内容受制于 globbing (和分词,但是,这里需要它)。将单行字符串的空格分隔标记读入数组的安全方法是:read -ra array <<<"$str"

答案 2 :(得分:0)

我不知道你需要什么样的突变,因为你所展示的并不是一种排列。但是如果你需要一个排列,你可以使用shell扩展:

echo {1..6}{1..6}{1..6}{1..6}{1..6}{1..6}

我省略了“word”字符串和换行符。

使用{word1,word2,word3,word4,word5,word6}代替字词。