GNU/Linux >> Znalost Linux >  >> Linux

Jak odstranit předponu slova pomocí grep?

Jak ostatní poznamenali, grep se pro tento úkol příliš nehodí, sed je dobrá volba, nebo pokud je text dobře uspořádán, jednoduchý cut může být jednodušší napsat:

echo www.abc.com | cut -d. -f2-
  • -d. říká cut použít . jako oddělovač.
  • -f2- říká cut vrátit pole 2 do nekonečna.

s grepovým --only-matching a \K

Můžete to udělat pomocí --only-matching grepu příznak:

echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'

který lze zkrátit na

echo "www.abc.com" | grep -Po 'www.\K.*'

Oba příkazy produkují

abc.com

s grep (GNU grep) 3.3.

Místo echo , pro další zkrácení příkazu použiji řetězec here:

grep -Po 'www.\K.*' <<< "www.abc.com"

\K resetuje počáteční bod zápasu a v podstatě zapomene na shodné "www.". Další informace naleznete v části \K .

s grepovým pozitivním pohledem na pozadí

Můžete to udělat také s pozitivním pohledem na pozadí:

grep -Po '(?<=www.).*' <<< "www.abc.com"

s oddělovačem polí awk -F

awk -F 'www.' <<< "www.abc.com" '$2{print $2}'

Toto se vytiskne

abc.com

$2{print $2} část vytiskne druhé pole, pokud je definováno. To je nutné v případě víceřádkového vstupu, aby se předešlo zobrazení prázdných řádků pro vstupní řádky, které neobsahují oddělovač pole.


Řetězce pomocí grep neupravujete v prostředí Unix grep se obvykle používá k nalezení nebo odstranění některých řádků z textu. Raději použijte sed místo toho:

$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com

Abyste jej mohli efektivně používat, budete se muset naučit regulární výrazy.

Sed může také upravit soubor na místě (upravit soubor), pokud předáte -i argument, ale buďte opatrní, pokud napíšete špatný sed, můžete snadno přijít o data a použijte -i vlajka.

Příklad

Z vašich komentářů uhodněte, že máte dokument TeX a chcete odstranit první část všech názvů domén .com. Pokud se jedná o váš dokument test.tex :

\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}

pak jej můžete transformovat pomocí tohoto sed příkaz (přesměrujte výstup do souboru nebo upravte na místě pomocí -i ):

$ sed 's/\([a-z0-9-]\+\.\)\(\([a-z0-9-]\+\.\)\+com\)/\2/gi' test.tex 
\documentclass{article}
\begin{document}
example.com
example.com another.domain.com
\end{document}

Vezměte prosím na vědomí, že:

  • Běžná posloupnost povolených symbolů následovaných tečkou odpovídá [a-z0-9-]\+\.
  • V regulárním výrazu jsem použil skupiny (jejich části v rámci \( a \) ) k označení první a druhé části adresy URL a celou shodu nahradím její druhou skupinou (\2 v substitučním vzoru)
  • Doména by měla být doménou alespoň 3. úrovně .com (každých \+ opakování znamená alespoň jednu shodu)
  • Ve vyhledávání se nerozlišují velká a malá písmena (i vlajka na konci)
  • Umí více než jen shodu na řádek (g vlajka na konci)

Můžete to udělat pomocí grep snadno:

$ echo www.google.com | grep -o '[^.]*\.com'
google.com

Místo echo musíte dát svůj soubor.

$ grep -o '[^.]*\.com$' < file

Použil jsem zde regulární výraz '[^.]*.com'. To znamená:najdi mi slovo bez . v něm ([^.]* ), po kterém následuje .com (\.com v re). -o klíč říká, že grep musí zobrazit pouze tu část, která byla nalezena.


Linux
  1. Jak zvýraznit slovo ve výstupu „kočka“?

  2. Jak najít konkrétní text pomocí GREP v systému Linux

  3. Debian:Jak nainstalovat nebo odebrat balíčky DEB pomocí dpkg

  1. Jak odstranit soubory starší než N dní pomocí tmpreaper v Linuxu

  2. Jak zjistím, který běžící proces používá javu?

  3. Jak odstranit soubor bez použití rm?

  1. Jak odstranit diskový oddíl pomocí příkazu Parted

  2. Jak mohu grep rekurzivně?

  3. Jak odstranit ne-ascii znaky pomocí sed