I have a text file that I am trying to modify. I am taking the input file that has lines of the form of
(y+1/4,-x+1/2,z+3/4)
and trying to chan
#!/usr/bin/env bash
filename="227.dat"
re='[(]y[+]([[:digit:]/]+),-x[+]([[:digit:]/]+),z[+]([[:digit:]/]+)[)]';
while IFS= read -r line; do
if [[ $line =~ $re ]]; then
printf '\t%s' \
0 1 0 \
-1 0 0 \
0 0 1 \
"${BASH_REMATCH[1]}" \
"${BASH_REMATCH[2]}" \
"${BASH_REMATCH[3]}";
printf '\n';
else
echo "ERROR: $line does not match $re" 1>&2;
fi;
done <"$filename"
...given, your input, returns:
0 1 0 -1 0 0 0 0 1 1/4 1/2 3/4
...which as far as I can tell is correct.
A more complex approach, making unfounded extrapolations (given the lack of detail and exemplars in the question itself), might look like:
#!/usr/bin/env bash
while IFS='(),' read -a pieces; do
declare -A vars=( [x]=1 [y]=1 [z]=1 [x_sigil]='' [y_sigil]='' [z_sigil]='' )
for piece in "${pieces[@]}"; do
# 1 2 3 4
if [[ $piece =~ (-?)([xyz])([+]([[:digit:]/]+))? ]]; then
if [[ ${BASH_REMATCH[4]} ]]; then # only if there *are* digits
vars[${BASH_REMATCH[2]}]=${BASH_REMATCH[4]} # ...then store them.
fi
vars[${BASH_REMATCH[2]}_sigil]=${BASH_REMATCH[1]} # store - if applicable
fi
done
printf '\t%s' \
"0" "${vars[x_sigil]}1" 0 \
"${vars[y_sigil]}1" 0 0 \
0 0 "${vars[z_sigil]}1" \
"${vars[y]}" "${vars[x]}" "${vars[z]}"
printf '\n'
done
Given the sample inputs provided in a comment on this answer, output is:
0 1 0 1 0 0 0 0 1 1 1 1
0 1 0 1 0 0 0 0 1 1 1 1
0 1 0 1 0 0 0 0 1 1 1 1
0 1 0 1 0 0 0 0 -1 3/4 1/4 1/2
0 1 0 -1 0 0 0 0 1 1/2 3/4 1/4
0 -1 0 1 0 0 0 0 1 1/4 1/2 3/4
0 -1 0 -1 0 0 0 0 -1 1 1 1
0 -1 0 -1 0 0 0 0 -1 1 1 1
0 -1 0 -1 0 0 0 0 -1 1 1 1
0 -1 0 -1 0 0 0 0 1 1/4 3/4 1/2
0 -1 0 1 0 0 0 0 -1 1/2 1/4 3/4
0 1 0 -1 0 0 0 0 -1 3/4 1/2 1/4
0 -1 0 -1 0 0 0 0 1 1/4 3/4 1/2
0 -1 0 -1 0 0 0 0 1 1/4 3/4 1/2
0 -1 0 -1 0 0 0 0 1 1/4 3/4 1/2
0 -1 0 -1 0 0 0 0 -1 1 1 1
0 -1 0 1 0 0 0 0 1 1/4 1/2 3/4
0 1 0 -1 0 0 0 0 1 1/2 3/4 1/4
0 1 0 1 0 0 0 0 -1 3/4 1/4 1/2
0 1 0 1 0 0 0 0 -1 3/4 1/4 1/2
0 1 0 1 0 0 0 0 -1 3/4 1/4 1/2
0 1 0 1 0 0 0 0 1 1 1 1
0 1 0 -1 0 0 0 0 -1 3/4 1/2 1/4
0 -1 0 1 0 0 0 0 -1 1/2 1/4 3/4
0 -1 0 1 0 0 0 0 -1 1/2 1/4 3/4
0 -1 0 1 0 0 0 0 -1 1/2 1/4 3/4
0 -1 0 1 0 0 0 0 -1 1/2 1/4 3/4
0 -1 0 1 0 0 0 0 1 1/4 1/2 3/4