elbarna
elbarna

Reputation: 759

regex to exclude lowercase only strings, but save strings which contain capital

Look to those regex

find /tmp/MG/virt-manager-5.0.0/ -maxdepth 1 -type f |grep -v  [^a-z]+\.[^a-z]+
/tmp/MG/virt-manager-5.0.0/.mailmap
/tmp/MG/virt-manager-5.0.0/virt-manager
/tmp/MG/virt-manager-5.0.0/DESIGN.md
/tmp/MG/virt-manager-5.0.0/meson.build
/tmp/MG/virt-manager-5.0.0/NEWS.md
/tmp/MG/virt-manager-5.0.0/.gitignore
/tmp/MG/virt-manager-5.0.0/README.md
/tmp/MG/virt-manager-5.0.0/.pylintrc
/tmp/MG/virt-manager-5.0.0/.coveragerc
/tmp/MG/virt-manager-5.0.0/virt-install
/tmp/MG/virt-manager-5.0.0/.packit.yaml
/tmp/MG/virt-manager-5.0.0/COPYING
/tmp/MG/virt-manager-5.0.0/virt-xml
/tmp/MG/virt-manager-5.0.0/virt-manager.spec.in
/tmp/MG/virt-manager-5.0.0/INSTALL.md
/tmp/MG/virt-manager-5.0.0/meson_options.txt
/tmp/MG/virt-manager-5.0.0/virt-manager.spec
/tmp/MG/virt-manager-5.0.0/virt-clone
/tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md
/tmp/MG/virt-manager-5.0.0/setup.cfg

I want to get strings which contain CAPITAL letters, including .md .txt but only if words contain at least one capital letter, to explain better

CONTRIBUTING.MD OK
CONTRIBUTING.txt OK
CONTRIBUTING.TXT OK
Contributing.txt OK (has one capital letter)
hello.TXT OK (contain some capital letters)
contributing.txt NO (only lowercase)

I want to obtain this

  find /tmp/MG/virt-manager-5.0.0/ -maxdepth 1 -type f |grep -v REGEXWORKS

    /tmp/MG/virt-manager-5.0.0/DESIGN.md
    /tmp/MG/virt-manager-5.0.0/NEWS.md
    /tmp/MG/virt-manager-5.0.0/README.md
    /tmp/MG/virt-manager-5.0.0/COPYING
    /tmp/MG/virt-manager-5.0.0/INSTALL.md
    /tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md

how to do? Thanks

Upvotes: 1

Views: 91

Answers (4)

F. Hauri  - Give Up GitHub
F. Hauri - Give Up GitHub

Reputation: 70977

My two cents

Before using find command, with -maxdepth 1!

Notice: shell could do this by himself!

echo /tmp/MG/virt-manager-5.0.0/*[A-Z]*
/tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md /tmp/MG/virt-manager-5.0.0/COPYING /t
mp/MG/virt-manager-5.0.0/DESIGN.md /tmp/MG/virt-manager-5.0.0/INSTALL.md /tmp/MG
/virt-manager-5.0.0/NEWS.md /tmp/MG/virt-manager-5.0.0/README.md /tmp/MG/virt-ma
nager-5.0.0/virtManager

or

ls -dg /tmp/MG/virt-manager-5.0.0/*[A-Z]*
-rw-r--r-- 1 user  4401 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md
-rw-r--r-- 1 user 18092 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/COPYING
-rw-r--r-- 1 user 10438 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/DESIGN.md
-rw-r--r-- 1 user  1108 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/INSTALL.md
-rw-r--r-- 1 user 30648 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/NEWS.md
-rw-r--r-- 1 user  1114 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/README.md
drwxr-xr-x 6 user  4096 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/virtManager

And you even could directly iterate:

printf '%-20s %-19s %3s %4s %7s\n' File Type Lne Wrd Char;\
for file in /tmp/MG/virt-manager-5.0.0/*[A-Z]*; do
    mime=$(file -b --mime-type "$file")
    if [[ $mime == text* ]]; then
        read lines words chars < <(wc < "$file")
    else
        lines=0 words=0 chars=0
    fi
    printf '%-20s %-19s %3d %4d %7d\n' \
        "${file##*/}" "$mime" "$lines" "$words" "$chars"
done
File                 Type                Lne  Wrd    Char
CONTRIBUTING.md      text/plain          125  611    4401
COPYING              text/plain          339 2968   18092
DESIGN.md            text/plain          140 1377   10438
INSTALL.md           text/plain           42  150    1108
NEWS.md              text/plain          679 4675   30648
README.md            text/plain           30  147    1114
virtManager          inode/directory       0    0       0

Upvotes: 3

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185610

With Perl and a regex:

find . -type f | perl -F'/' -lane 'print if $F[-1] =~ /[[:upper:]]/'

Upvotes: 2

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185610

With awk and a regex:

find . -type f | awk -F'/' '$NF ~ "[[:upper:]]"'

Upvotes: 2

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185610

Simply like this, using a glob:

$ find . -type f -name '*[[:upper:]]*' 
./virt-manager-5.0.0/COPYING
./virt-manager-5.0.0/NEWS.md
./virt-manager-5.0.0/INSTALL.md
./virt-manager-5.0.0/README.md
./virt-manager-5.0.0/CONTRIBUTING.md
./virt-manager-5.0.0/DESIGN.md

The -type f is to match only files.

If you prefer a regex:

find .  | grep '/[^/]*[[:upper:]]'

that can be better written as:

find . -regextype 'egrep' -regex '.*/[^/]*[[:upper:]][^/]*$'

Note: -type f isn't combined with -regex like -name does to match only filenames.

Upvotes: 3

Related Questions