шаг 1: разделить пробелом, как обычно, получить массив
шаг 2: пройти по массиву, если найдем {[a-zA-Z]+
, объединить следующий элемент с пробелом и удалить следующий элемент.
тогда вы получили то, что хотели.следующая команда awk показана в качестве примера.
echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1"|awk '{split($0,a);
for(i=1;i<=length(a);i++){
if(a[i]~/{[a-zA-Z]+/){a[i]=a[i]" "a[i+1];delete a[i+1];}
if(a[i])print a[i];} }'
arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1
== update ==
OK, на основании вашего комментария это тоже работает:
step1, найдите те строки, которыеВы не хотите «разделять», заменить на специальную строку.и важно сохранить найденные строки в другой массив.Пример в примере grep:
echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|grep -E -o '\{([a-zA-Z]+\s*)*\}'
{with space}
{abc def}
{xyz zyx}
after replace:xxxxxxxxx as the special string
kent$ echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|sed -r 's#\{([a-zA-Z]+\s*)*\}#xxxxxxxxx#g'
arg1 {0 1} arg2 {5 87} string xxxxxxxxx ar3 1 xxxxxxxxx xxxxxxxxx
step2, делим split
step3, заменяем специальную строку обратно на правый индекс.