Как разобрать строку с несколькими символами для разделения сценариев on-Bash

#bash #shell #sh #ifs

Вопрос:

У меня есть текстовый файл со следующим содержимым:

folder4/file2folder4.txt >>> folder2/folder2_1/file1folder2.txt

У меня есть скрипт, который анализирует каждую строку следующим образом

 while IFS=" >> " read -r src dest
do 

    if [ "$src" != "" ]; then
        SOURCEFILES =("$src")
    fi
    if [ "$dest" != "" ]; then  
        DESTINATIONFILES =("$dest")
    fi  
done < $TransferDescriptor
 

Он анализирует следующим образом:

ИСХОДНЫЙ ФАЙЛ=»folder4/file2folder4.txt»

ПУНКТ НАЗНАЧЕНИЯ=»> folder2/folder2_1/file1folder2.txt»

Но чего я хочу

ИСХОДНЫЙ ФАЙЛ=»folder4/file2folder4.txt»

ПУНКТ НАЗНАЧЕНИЯ=»folder2/folder2_1/file1folder2.txt»

Любая помощь. Спасибо

Ответ №1:

IFS это не один разделитель с несколькими символами; вместо этого это набор разделителей из одного символа. Вы можете использовать регулярное выражение для разделения двух полей, разделенных произвольным разделителем.

 regex='(.*) >> (.*)'
while IFS= read -r line dest
do 
    [[ $line =~ $regex ]] || continue
    src=${BASH_REMATCH[1]}
    dest=${BASH_REMATCH[2]}

    if [[ -n $src ]]; then
        SOURCEFILES =("$src")
    fi
    if [[ -n $dest ]]; then  
        DESTINATIONFILES =("$dest")
    fi  
done < "$TransferDescriptor"
 

Ответ №2:

Вы не можете вводить несколько символьных строк IFS . Он поддерживает только отдельные символы, используемые в качестве разделителя полей ввода.

Вы можете использовать регулярные выражения BASH здесь, например:

 while IFS= read -r line; do
   if [[ $line =~ $re ]] ; then
      srcfile="${BASH_REMATCH[1]}"
      dest="${BASH_REMATCH[2]}"
   fi
done < file
 

Проверьте нашу переменную:

 declare -p srcfile dest
declare -- srcfile="folder4/file2folder4.txt"
declare -- dest="folder2/folder2_1/file1folder2.txt"