我想在任何輸入字串中插入點。
例如,輸入anystr和輸出所有可能性
a.nystr
an.ystr
any.str
anys.tr
anyst.r
a.n.ystr
a.ny.str
a.nys.tr
a.nyst.r
an.y.str
an.ys.tr
an.yst.r
......
anys.t.r
a.n.y.str
a.n.ys.tr
......
......
a.n.y.s.t.r
插入一個點很容易
a=anystr
for i in `seq 1 $((${#a}-1))`; do
echo "${a:0:$i}.${a:$i}"
done
但是如何遍歷不同長度的輸入字串的所有可能性?
uj5u.com熱心網友回復:
這是一種使用 GNU sed 的潛在解決方案,改編自https://codegolf.stackexchange.com/a/204510/95793:
echo "anystr" | eval echo $(gsed 's/\B/{,.}/g') | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r
解釋
是這種\B方法的關鍵。\B是“逆”字邊界標記,即“非字邊界”標記,sed 命令{,.}在這些點中的每一個處插入,即
echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r
然后{,.}由外殼擴展,即
eval echo "a{,}"
a a
eval echo "a{,}n{,}"
an an an an
eval echo "a{,.}"
a a.
eval echo "a{,.}n{,}"
an an a.n a.n
eval echo "a{,.}n{,.}"
an an. a.n a.n.
因此,將它們放在一起,您將獲得預期的輸出,并且可以使用換行符替換空格tr:
echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r
eval echo "a{,.}n{,.}y{,.}s{,.}t{,.}r"
anystr anyst.r anys.tr anys.t.r any.str any.st.r any.s.tr any.s.t.r an.ystr an.yst.r an.ys.tr an.ys.t.r an.y.str an.y.st.r an.y.s.tr an.y.s.t.r a.nystr a.nyst.r a.nys.tr a.nys.t.r a.ny.str a.ny.st.r a.ny.s.tr a.ny.s.t.r a.n.ystr a.n.yst.r a.n.ys.tr a.n.ys.t.r a.n.y.str a.n.y.st.r a.n.y.s.tr a.n.y.s.t.r
eval echo "a{,.}n{,.}y{,.}s{,.}t{,.}r" | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r
編輯
此外,您不需要使用eval,這僅用于此處洗掉“步驟”,例如
echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r
echo a{,.}n{,.}y{,.}s{,.}t{,.}r | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r
uj5u.com熱心網友回復:
這是使用我在評論中提出的二進制設計思想的實作:
value="anystr"
len=$(( ${#value} - 1 ))
combos=$( bc <<< "2^($len)-1" )
count=0
periods=('' '.')
while [[ count -le $combos ]]
do
# Convert to binary - see https://stackoverflow.com/a/10278539/2203038
binary_count=$( dc -e "$count 2op")
# add leading 0's and a single trailing 0 (we never put a . after the last letter)
binary_count=$( printf "%0${len}d" $binary_count )
# loop through the binary_count and value - spitting out a letter and a '.' or ''
result=''
x=0
while [[ x -le ${#value} ]]
do
result="$result${value:$x:1}${periods[${binary_count:$x:1}]}"
x=$(( x 1 ))
done
echo "$count: $binary_count $result"
count=$(( count 1 ))
done
結果如下:
0: 00000 anystr
1: 00001 anyst.r
2: 00010 anys.tr
3: 00011 anys.t.r
4: 00100 any.str
5: 00101 any.st.r
6: 00110 any.s.tr
7: 00111 any.s.t.r
8: 01000 an.ystr
9: 01001 an.yst.r
10: 01010 an.ys.tr
11: 01011 an.ys.t.r
12: 01100 an.y.str
13: 01101 an.y.st.r
14: 01110 an.y.s.tr
15: 01111 an.y.s.t.r
16: 10000 a.nystr
17: 10001 a.nyst.r
18: 10010 a.nys.tr
19: 10011 a.nys.t.r
20: 10100 a.ny.str
21: 10101 a.ny.st.r
22: 10110 a.ny.s.tr
23: 10111 a.ny.s.t.r
24: 11000 a.n.ystr
25: 11001 a.n.yst.r
26: 11010 a.n.ys.tr
27: 11011 a.n.ys.t.r
28: 11100 a.n.y.str
29: 11101 a.n.y.st.r
30: 11110 a.n.y.s.tr
31: 11111 a.n.y.s.t.r
我最近從 bash 更改為 python 作為我選擇的語言。所以我也傾向于在 python 中嘗試這個:
value="anystr"
for x in range(2**(len(value)-1)):
binary_value = x
for c in range(len(value)):
print(value[c],end='')
if binary_value & 1:
print('.', end='')
binary_value >>= 1
print()
基于 python 實作的簡單性,我覺得我可以回到 bash 實作并使其更簡單(例如,將二進制值保持為 int 而不是字串)。但是,我會讓其他人提供一個更簡單的 bash 答案(盡管我認為我們很難找到比 jared 更簡單的答案!
uj5u.com熱心網友回復:
使用 POSIX sh:
dot() {
dot_helper()
case ${#2} in
(0) printf '%s\n' "$1" ;;
(*) dot_helper "$1" "${2#?}"
dot_helper "${1%"$2"}.$2" "${2#?}"
esac
case ${#1} in
(0) ;;
(*) dot_helper "$1" "${1#?}"
esac
}
$ dot anystr
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
...
a.n.y.s.t.r
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519922.html
標籤:linux细绳重击壳
