GNU/Linux >> Znalost Linux >  >> Linux

Potřebujete uniknout z regulárních znaků v Sed, aby byly interpretovány jako regulární znaky?

Zdá se, že např.
cat sed_data.txt | sed 's/b[0-9]{3}b/NUMBER/g'
které musím escape znaky k vytvoření regulárního výrazu. V tomto případě jsem musel uniknout složeným závorkám, aby to bylo interpretováno jako několikrát.
Proč? Očekával jsem, že vše bude regulární znak, pokud nebude escapován. Tj. naopak.

Přijatá odpověď:

Je to proto, že sed používá POSIX BRE (Basic Regular Expressions) na rozdíl od ERE (Extended Regular Expressions), na které jste pravděpodobně zvyklí z Perlu nebo přátel.

Z sed(1) manuálová stránka:

REGULAR EXPRESSIONS
       POSIX.2 BREs should be supported, but they aren't completely because of
       performance problems.  The n sequence in a regular expression  matches
       the newline character, and similarly for a, t, and other sequences.

Relevantní citace z výše uvedeného odkazu:

Základní regulární výrazy nebo příchuť BRE standardizuje příchuť podobnou té, kterou používá tradiční příkaz UNIX grep. Toto je v podstatě nejstarší příchuť regulárního výrazu, která se dodnes používá. Jedna věc, která odlišuje tuto příchuť, je to, že většina metaznaků vyžaduje zpětné lomítko, aby metaznak získal jeho příchuť. Většina ostatních příchutí, včetně POSIX ERE, používá zpětné lomítko k potlačení významu metaznaků.

Doslovně citováno z komentáře Craiga Sanderse:

Všimněte si, že alespoň v GNU sed můžete sed říct, aby používal rozšířené regulární výrazy pomocí volby -r nebo –regexp-extended příkazového řádku. To je užitečné, pokud se chcete vyhnout ošklivému sed skriptu nadměrným escapováním.


Linux
  1. sed - jak udělat skupiny regulárních výrazů pomocí sed

  2. Co je špatného s mým předběžným regulárním výrazem v GNU sed?

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

  1. Sed Odebrat znaky z nového řádku?

  2. Proč sed ve výchozím nastavení nepoužívá rozšířený režim regulárních výrazů?

  3. Echoed escape sekvence nejsou v Linuxu tty interpretovány

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

  2. Uniknout neznámým znakům z řetězce pro -exec?

  3. Jak používat dopředné vyhledávání k vyloučení speciálních znaků v regulárním výrazu