GNU/Linux >> Znalost Linux >  >> Linux

Problém(y) s regulárním výrazem v Bash:[^negate] zřejmě nefunguje

Jste si jisti, že se děje to, co chcete? Když spustíte ls /directory | grep '[^term]' v podstatě nepátráte po písmenech t e r m. To znamená, že pokud má soubor ve svém názvu jiná písmena, bude se stále zobrazovat ve výstupu ls . Vezměte si například následující adresář:

$ ls
alpha  brave  bravo  charlie  delta

Nyní, když spustím ls |grep '^[brav]' Dostávám následující:

$ ls |grep '^[brav]'
alpha
brave
bravo

Jak můžete vidět, nejenže jsem dostal brave a bravo Také mám alpha protože znaková třída [] obdrží jakýkoli dopis z tohoto seznamu.

Pokud tedy spustím ls |grep '[^brav]' Všechny soubory, které neobsahují znaky b r a v, dostanu kamkoli v názvu.

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

Pokud si všimnete, že obsahuje celý výpis adresáře, protože všechny soubory měly alespoň jeden písmeno, které nebylo zahrnuto do třídy znaků.

Takže jak řekl Kanvuanza, sáhnout po inverzní hodnotě "termín" na rozdíl od znaků t e r m měli byste to udělat pomocí grep -v .

Například:

$ ls |grep -v 'brav'
alpha
charlie
delta

Také pokud nechcete, aby soubory, které mají ve třídě nějaké znaky, použijte grep -v '[term]' . To zabrání zobrazení souborů, které mají některý z těchto znaků. (Kanvuanzova odpověď)

Například:

$ ls |grep -v '[brav]'

Jak můžete vidět, nebyly uvedeny žádné soubory, protože všechny soubory v tomto adresáři obsahovaly alespoň jedno písmeno z této třídy.

Dodatek:

Chtěl jsem dodat, že pomocí PCRE je možné použít pouze regex k odfiltrování pomocí negovaných výrazů. K tomu byste použili něco známého jako negativní dopředný regulární výraz:(?!<regex>) .

Takže pomocí výše uvedeného příkladu můžete udělat něco takového, abyste získali požadované výsledky bez použití grep příznaky.

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

Aby bylo možné tento regulární výraz dekonstruovat, nejprve se shoduje na začátku řádku ^ a poté hledá řetězce, které neodpovídají brav následovat poté. Pouze alpha , charlie a delta shodují se, takže jsou to jediné, které se vytisknou.


Myslím, že grep -v vlajka dělá, co chcete. Z manuálové stránky:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

Můžete použít ls /directory | grep -v [term] vytisknout všechny neodpovídající řádky.


Linux
  1. Definice regulárního výrazu?

  2. základy grep

  3. eclipse/tomcat:nasazení již nefunguje (ClassNotFoundException)

  1. LD_LIBRARY_PATH zřejmě nefunguje

  2. Proč `\d` nefunguje v regulárních výrazech v sed?

  3. Při instalaci Rust toolchain do Dockeru nefunguje příkaz Bash `source`

  1. Proč Bash `(())` nefunguje uvnitř `[[]]`?

  2. Regulární výraz pro hledání dvojitých znaků v Bash

  3. Regulární výraz se sed