Я понятия не имею, почему раздел не отображается на вашем рабочем столе Arch (графические интерфейсы IMO странные и ненадежные и часто содержат раздражающие жестко запрограммированные предположения 1 ), но если раздел виден операционной системе, например с помощью sudo fdisk -l
или sudo blkid
или sudo lsblk
, тогда вы можете вручную смонтировать раздел в любом месте. Например:
sudo mkdir -p /windows-data
sudo mount -t ntfs -o ro /dev/sda2 /windows-data
Как всегда, вы можете настроить точные параметры монтирования (например, для uid, gid, perms) в соответствии с вашими потребностями.
Вы также можете вызвать автоматическое монтирование раздела, добавив строку в / etc / fstab
, например:
/ dev / sda2 / windows-data ntfs uid = 1000, gid = 1000, noatime, allow_other 0 2
(это все в одной строке, а не в двух)
1 Если бы мне пришлось угадывать, я бы сказал, что рабочий стол Arch знает, что такое "HPFS / NTFS Раздел / exFAT есть и будет отображать его, но не знает, что такое «основные данные Microsoft», поэтому игнорирует его.
grep 201806{19..21} test
расширяется оболочкой до:
grep 20180619 20180620 20180621 test
Что grep
понимает как поиск 20180619
внутри 3 файлов, 20180620
, 20180621
и test
.
Если изменить на:
grep -e201806{19..21} test
Затем это расширяется до:
grep -e20180619 -e20180620 -e20180621 test
Что дает 3 e
выражения для grep
для поиска в test
.
Или вы можете:
printf '%s\n' 201806{19..21} | grep -f - test
Когда мы передаем выражения в виде количества строк ввода вgrep
(с некоторыми реализациями, вам может понадобиться /dev/stdin
вместо-
).
В частности, zsh
вы также можете сделать это:
numbers=({19..21} 25 31)
grep -E "201801(${(j:|:)numbers})" test
Где мы используем флаг расширения параметра (j:|:)
для соединения элементов массива с|
(расширенным оператором чередования регулярных выражений ), чтобы его можно было использовать в качестве ERE.
Или вы можете связать этот массив со скаляром регулярного выражения с помощью:
$ typeset -T re numbers '|'
$ numbers=({19..21} 25 31)
$ echo $re
19|20|21|25|31
В то время как регулярные выражения обычно не имеют возможности сопоставления диапазонов чисел, zsh
шаблоны (, которые с extendedglob
функционально эквивалентны регулярным выражениям )работают с оператором <x-y>
(только для последовательностей десятичных цифр):
print -rl -- ${(M)${(f)"$(<test)"}:#*201806<19-21>*}
Да, grep
по умолчанию рассматривает только свой первый аргумент как регулярное выражение.
Это означает, что
grep {1..9} file
, который расширяется до
grep 1 2 3 4 5 6 7 8 9 file
будет вызывать grep
с 1
в качестве выражения для соответствия в других операндах, и ожидается, что эти другие операнды будут именами файлов.
Другая ваша команда:
grep 201806* test
Это попытается сопоставить 201806*
как шаблон подстановки имени файла. У вас нет файлов, имена которых начинаются с 201806
в текущем каталоге, поэтому оболочка zsh
не может развернуть шаблон и выдает сообщение об ошибке no matches found
.
В других Bourne -подобных оболочках, если бы шаблон не соответствовал именам файлов, он остался бы нераскрытым и использовался бы как регулярное выражение с grep
. Выражение 201806*
, рассматриваемое как регулярное выражение, соответствует 20180
, за которым следует ноль или более 6
символов, например. 2018066666
.
Вместо этого вы можете создать регулярное выражение, соответствующее вашему диапазону:
grep -E '201806(19|20|21)' test
или
grep -E '201806(19|2[01])' test
-E
необходимо, чтобы grep
понять|
(чередование )в выражении (это чередование делает его расширенным регулярным выражением ).
Вы также можете создать регулярное выражение из раскрытия фигурной скобки:
set -- {19..21}
re=$( IFS='|'; printf '201806(%s)' "$*" )
grep -E "$re" test
Сначала будут установлены позиционные параметры $1
, $2
и $3
.на желаемые номера в диапазоне. Затем переменная re
будет установлена на 201806(%s)
, где printf
заменит %s
этими числами, разделенными |
.
Вызов grep
будет использовать 201806(19|20|21)
в качестве регулярного выражения.
строки без кавычек интерпретируются оболочкой до выполнения команды, в вашем случае испробованная вами команда будет расширена доgrep 20180619 20180620 20180621 test
$ echo grep 201806{19..21} test
grep 20180619 20180620 20180621 test
Одним из способов обхода является указание чередования регулярных выражений:
$ grep -E '201806(19|20|21)' test
20180619:
20180620:
20180621:
Вы можете построить числовой диапазон с помощью регулярных выражений, но это непросто. Подробнее см.https://www.regular-expressions.info/numericranges.html
Другой вариант — использоватьawk
$ awk -F: '$1>=20180619 && $1<=20180621' ip.txt
20180619:
20180620:
20180621:
Здесь мы разделяем строку на :
и затем сравниваем первое поле $1
с требуемым диапазоном