Я знаю какое-то регулярное выражение, но не знаю, как заставить его работать. Я хочу перечислить все файлы, у которых нет .tab. и не имеют ~ в конце имени файла и не являются .o (или .bin)
Я могу перечислить все файлы с расширением .tab. написав
ls | grep .tab.
Однако я не могу понять, как заставить его игнорировать эти файлы и перечислить все остальное. Я попытался
ls | grep [^(.tab.)]
но получил ошибку и подумал, что мое последнее регулярное выражение будет
ls | grep ([^(.tab.)]|.o$|.bin$)
Но я никогда не делал много регулярных выражений, поэтому я уверен, что финал неправильный, даже если синтаксис был правильным.
Как я это сделаю, будет зависеть от контекста. Если бы это не было для сценария, а я просто хотел бы это увидеть, я бы согласился использовать ls:
ls -a | egrep -v '(tab|\.o$|\.bin$|~$)'
Если бы в сценарии, я бы использовал цикл:
for file in *; do
#file $file in .* *; do -- To Include dot (hidden files)
if ! egrep -q '(tab|\.o$|\.bin$|~$)' <<<$file; then
echo $file
fi
done
Вы можете добавить еще один if test с -f, если вам нужны только обычные файлы, а не каталоги. Если вы хотите сделать это рекурсивно, вы можете использовать GNU find с тестом -regex и posix-egrep. Но примите во внимание тот факт, что это регулярное выражение будет соответствовать полному пути относительно каталога, в котором вы выполняли поиск.
Еще один хороший вариант - расширенные глобусы, если у вас есть поддержка, см. Ответ Денниса.
В -v
/--invert-match
опция делает строки вывода grep, которые делают не соответствие. Так:
ls | grep -v .tab.
или
ls | grep --invert-match .tab.
в твоем случае.
shopt -s extglob
ls -l !(*.bin|*.o|*~|*.tab.*)
ls | egrep -v (.tab|.o$|.bin$)
должен это сделать. egrep - это в основном grep -E, который поддерживает «расширенное» регулярное выражение, поэтому такие вещи, как (x | y), работают.