Конвейер ls to grep. Почему grep игнорирует вывод команды ls?

Этот вопрос очень похож на вопрос, на который уже есть ответhttps://stackoverflow.com/questions/13272717/inner-join-on-two-text-files

Самый простой способ (и работа с содержимым файла примера )— использовать

join file1 file2

Это предполагает, что входные файлы отсортированы.

0
20.10.2019, 03:23
2 ответа

Я предполагаю, что вы спрашиваете: «Почему 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

(это исключает любое имя, содержащее хотя бы одну строчную букву, а также исключает любое имя, содержащее хотя бы одну цифру ).

1
28.01.2020, 02:39

Синтаксис \>означает совпадение в конце слова . То, что вы хотите, вероятно,

ls | egrep "^[A-Z.]+$"

, где ^соответствует началу строки, а $соответствует концу строки.

0
28.01.2020, 02:39

Теги

Похожие вопросы