Выведите переменную и затем grep, чтобы увидеть, существует ли значение в файле и ничего не возвращает. Unix Shell Scripting
Я пытаюсь выяснить, как определить, содержит ли переменная значение из файла, используя grep, это ничего не возвращает, поэтому я собираюсь объяснить это.
У меня есть мой код, который это:
MyFiles="MyFile-I-20160606_141_Employees.txt"
DirFiles="/dev/fs/C/Users/salasfri/Desktop/MyFiles.txt"
for OutFile in $(cat $DirFiles); do
if [[ $( echo $MyFiles | grep -c $OutFile ) -gt 0 ]]; then
print "The file $OutFile exist!!"
fi
done
и файл в /dev/fs/C/Users/salasfri/Desktop/MyFiles.txt содержит следующие значения:
MyFile-I-*_141_Employees.txt
MyFile-I-*_141_Products.txt
MyFile-I-*_141_Deparments.txt
Идея состоит в том, чтобы проверить, найдена ли переменная "MyFiles" в файле MyFiles.txt, как вы можете видеть, используя шаблон "*", так как это дата, она изменится.
что решения не возвращают никакого количества файлов, я что-то не так делаю?
2 ответа
Вы можете попробовать изменить строку поиска перед поиском.
Пример с тремя тестовыми строками:
for teststring in MyFile-I-20160606_141_Employees.txt MyFile-I-20160606_142_Employees.txt MyFile-I-20160606_141_Others.txt
do
grepstr=$(sed 's/[0-9]\{8\}_/*_/' <<< "${teststring}")
fgrep "${grepstr}" "${DirFiles}"
found=$(fgrep "${grepstr}" "${DirFiles}")
if [ $? -eq 0 ]; then
echo "${found} matches ${teststring}."
fi
done
В вашем случае вы можете сделать код короче с
fgrep -q "$(sed 's/[0-9]\{8\}_/*_/' <<< "${MyFiles}")" $DirFiles &&
echo "The file $(sed 's/[0-9]\{8\}_/*_/' <<< "${MyFiles}") exist!!"
Ваши шаблоны - это шаблоны в стиле глобуса, а не регулярные выражения. Шаблон abc-*_X.txt
не будет соответствовать строке abc-1234_X.txt
,
Вы хотите использовать конструкцию оболочки, которая выполняет сопоставление глобуса.
MyFiles="MyFile-I-20160606_141_Employees.txt"
sed 's/\r$//' "/dev/fs/C/Users/salasfri/Desktop/MyFiles.txt" \
| while IFS= read -r Pattern; do
if [[ $MyFiles == $Pattern ]]; then
print "$MyFiles matches pattern $Pattern"
break
fi
done