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.