Этот вопрос очень похож на вопрос, на который уже есть ответhttps://stackoverflow.com/questions/13272717/inner-join-on-two-text-files
Самый простой способ (и работа с содержимым файла примера )— использовать
join file1 file2
Это предполагает, что входные файлы отсортированы.
Я предполагаю, что вы спрашиваете: «Почему DIRNAME/
соответствует расширенному регулярному выражению \<[A-Z]+\>
, хотя в нем есть символ, который не является заглавной буквой (/
)?».
Ваше регулярное выражение соответствует всему, что содержит слово , написанное в верхнем регистре:
$ printf '%s\n' "this is not matched" "this IS matched" | egrep "\<[A-Z]+\>"
this IS matched
\<
и \>
соответствуют нулевой -ширине «границы слова», т. е. пробелу между «символом слова» и символом другого типа (или началом/концом слова. строка ). Словесный символ — это любой символ из класса[[:alpha:]_]
(букв и подчеркивания ).
Ваше выражение соответствует чему-то вроде DIRNAME/
, так как DIRNAME
соответствует выражению (, перед D
и послеE
)есть граница слова.
Чтобы отфильтровать определенные имена из списка каталогов, не используйте grep
или другие средства работы с текстом на основе строки -. Имена файлов могут содержать символы новой строки, поэтому инструментам на основе строки -будет трудно делать правильные вещи, если вы не наложите ограничения на имена файлов.
Вместо этого, чтобы получить все имена в верхнем регистре в каталоге вbash
:
$ ls -p -d *
DIR/ FILE TEST123 dir/ file test123
$ ls -p -d !(*[[:lower:]]*)
DIR/ FILE TEST123
Для этого требуется shopt -s extglob
для включения расширенных шаблонов подстановки.Расширенный шаблон подстановки !(*[[:lower:]]*)
соответствует всему, что не содержит строчных букв.
Обратите внимание, что шаблон не учитывает /
, который ls -p
добавляет к именам каталогов. Это связано с тем, что шаблон соответствует именам файлов, и нет имени файла, содержащего символ /
. Кроме того, шаблон расширяется перед вызовом ls
.
Если вы хотите дополнительно отсеять имена, содержащие цифры, используйте
$ ls -p -d !(*[[:lower:][:digit:]]*)
DIR/ FILE
(это исключает любое имя, которое содержит хотя бы одну строчную букву или цифру )или,
$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)
DIR/ FILE
(это исключает любое имя, содержащее хотя бы одну строчную букву, а также исключает любое имя, содержащее хотя бы одну цифру ).
Синтаксис \>
означает совпадение в конце слова . То, что вы хотите, вероятно,
ls | egrep "^[A-Z.]+$"
, где ^
соответствует началу строки, а $
соответствует концу строки.