루핑을 필요로하지 않고 sed에 4 번의 호출만을 사용하는 버전. 맹세 해, 나의 버전은 2 개의 수 치가 동등하다는 것을 검사하지 않는다. 사실, 두 번째 것은 무시되고 심지어 생략 될 수 있습니다. "Gene Code (91K - Q) D2 fragment, D74F"
. 하한 및 상한은 어느 쪽의 순서로든 나타날 수 있습니다. 하한이 상한보다 큰 경우, 출력 순서가 반대로됩니다.
$ cat foo
#!/usr/bin/env bash
# Script to expand $1 passed as:
# "Gene Code (91K - 91Q) D2 fragment, D74F"
#
# into the output:
#
# Gene Code, 91K, D2 fragment, D74F
# Gene Code, 91L, D2 fragment, D74F
# Gene Code, 91M, D2 fragment, D74F
# Gene Code, 91N, D2 fragment, D74F
# Gene Code, 91O, D2 fragment, D74F
# Gene Code, 91P, D2 fragment, D74F
# Gene Code, 91Q, D2 fragment, D74F
# Copy $1 into FMT_STRING, replacing the " (91K - 91Q)" bit with a ', %s,'
# printf directive, such as 'Gene Code, %s, D2 fragment, D74F':
FMT_STRING="$(sed -e 's/ (.* - .*)/, %s,/' <<< "$1")"
# Parse the beginning and ending bounds and format them with just a
# space between, such as '91K 91Q':
BOUNDS="$(sed -e 's/^[^(]*(\(.*\) - \(.*\)) .*/\1 \2/' <<< "$1")"
# Extract the (first) static numeric part from BOUNDS, e.g. '91'
NUMERIC="$(sed -e 's/[^0-9].*//' <<< "$BOUNDS")"
# remove all digits [0-9] from BOUNDS, e.g. 'K Q'
BOUNDS="$(sed -e 's/[0-9]//g' <<< "$BOUNDS")"
FMT_STRING="$(printf "$FMT_STRING" "${NUMERIC}%c")"
jot -w "$FMT_STRING" - $BOUNDS
샘플 출력 :
$ ./foo "Gene Code (737L - 737X) D2 fragment, D74F"
Gene Code, 737L, D2 fragment, D74F
Gene Code, 737M, D2 fragment, D74F
Gene Code, 737N, D2 fragment, D74F
Gene Code, 737O, D2 fragment, D74F
Gene Code, 737P, D2 fragment, D74F
Gene Code, 737Q, D2 fragment, D74F
Gene Code, 737R, D2 fragment, D74F
Gene Code, 737S, D2 fragment, D74F
Gene Code, 737T, D2 fragment, D74F
Gene Code, 737U, D2 fragment, D74F
Gene Code, 737V, D2 fragment, D74F
Gene Code, 737W, D2 fragment, D74F
Gene Code, 737X, D2 fragment, D74F
범위를 반대로하면 출력이 반전됩니다.
$ ./foo "Gene Code (737X - 737L) D2 fragment, D74F"
Gene Code, 737X, D2 fragment, D74F
Gene Code, 737W, D2 fragment, D74F
Gene Code, 737V, D2 fragment, D74F
Gene Code, 737U, D2 fragment, D74F
Gene Code, 737T, D2 fragment, D74F
Gene Code, 737S, D2 fragment, D74F
Gene Code, 737R, D2 fragment, D74F
Gene Code, 737Q, D2 fragment, D74F
Gene Code, 737P, D2 fragment, D74F
Gene Code, 737O, D2 fragment, D74F
Gene Code, 737N, D2 fragment, D74F
Gene Code, 737M, D2 fragment, D74F
Gene Code, 737L, D2 fragment, D74F