#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"