sed
odstranění všeho do první tečky včetně, pokud je na daném řádku více než jedna tečka, a to pro celý soubor.
Před sed:
akamai.com
cdnjs.cloudflare.com
com.cdn.cloudflare.net
Po sed:
akamai.com
cloudflare.com
cdn.cloudflare.net
Přijatá odpověď:
$ sed '/\..*\./s/^[^.]*\.//' file
akamai.com
cloudflare.com
cdn.cloudflare.net
sed
skript nejprve porovná řádky, které obsahují alespoň dvě tečky, pomocí regulárního výrazu \..*\.
(mohlo být také zapsáno [.].*[.]
). U řádků, které tomu odpovídají, se provede substituce, která odstraní vše až po první tečku včetně.
Pomocí awk
, což je ve srovnání s výše uvedeným poněkud zdlouhavé:
$ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net
Zde, kdykoli existuje více než dvě pole oddělená tečkami, rozdělíme aktuální řádek na tečky a poté z něj znovu vytvoříme aktuální záznam, přičemž první pole přeskočíme. Koncová 1
na konci způsobí, že se vytiskne každý řádek (upravený nebo neupravený).
Kratší awk
stejným způsobem jako sed
řešení:
$ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net
Speciální znak „#“ v příkazu Perl Ssh?
Spočítat počet řádků s řetězcem vyskytujících se Nkrát ve více sloupcích?