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ácutpoužít.jako oddělovač.-f2-říkácutvrá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 (\2v 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 (
ivlajka na konci) - Umí více než jen shodu na řádek (
gvlajka 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.