テキストファイルのすべてのサブドメインを削除する方法は? 「.」を含むその前のすべての項目を削除する必要があると思いますか?
入力する:
unix.stackexchange.com
www.example.org
example.example.tld
予想出力:
stackexchange.com
example.org
example.tld
編集する:
サブドメインのないドメインは変更されていないままにしてください。ドメイン全体にサブドメインがある場合にのみタッチする必要があります。つまり、「.」が2つ以上
google.comはgoogle.comの入力を維持する必要があります。
google.com
mail.google.com
予想出力:
google.com
google.com
答え1
最初のサブドメインを削除するには、次の手順に従います。
cut -d . -f 2- input
複数のレベルのサブドメインがある場合は、組み合わせを使用してドメインの最後の2つの要素を保存sub2.sub1.domain.com
できます。cut
rev
rev input | cut -d . -f -2 | rev
答え2
サンプル
www.google.com
prep.ai.mit.edu
最後の2つのトップレベルドメインを維持し、
使用sed
sed 's/.*\.\(.*\..*\)/\1/'
どこ
.*\.
Greedyはすべての文字(ドットを含む)とドットと一致します。\( \)
一致する文字列を覚えてください.*\..*
任意の文字を複数回使用(1)、任意の文字を複数回使用- (1) 上記の貪欲によりポイントが一致しません。
\1
最初に記憶された文字列を呼び出します。
使用(gnu)grep
grep -Eo '[^.]*.[^.]*$' data
google.com
mit.edu
- 正規表現パターン()は、行の末尾にアンカーがあることを
[^.]*.[^.]*$
除いて、ほとんど上記のように読み取られます。$
最初のサブドメインの削除、使用sed
(情報の保持、仕様変更)
sed -e 's/^[^.]*\.//' data
google.com
ai.mit.edu
どこ
^[^.]*\.
点ではなく行^
の始まりとして発音され、点として数回発音されます。[^.]
.
*
\.
- 何も置き換えられませんでした。
- コメントで述べたように、これは(行がドットで始まらない場合)
sed
に短縮することができます。's/[^.]*.//'
答え3
.
そのフィールドが行の区切られた最後の2つのフィールドになると判断された場合は、次のものを使用できます。
$ awk -F. -v OFS='.' '{print $(NF-1),$NF}' file
stackexchange.com
example.org
example.tld
またはsed
:
$ sed 's/.*\.\([^.]*\..*\)$/\1/' file
stackexchange.com
example.org
example.tld
そして、sed
サポートしている場合は-E
少しきれいになります。
sed -E 's/.*\.([^.]*\..*)$/\1/' file
stackexchange.com
example.org
example.tld
答え4
基準を使用して、sed
最後と最後の2番目のコンポーネントを除くすべてのコンポーネントを削除します。
sed 's/.*\.\(.*\..*\)/\1/'
残念ながら、この正規表現は嵐の後の森のように見えます。段階的に構築しましょう:
.*\.
ドットで終わる任意の数の文字(ドットを含む)です。- 式の後には別の点が必要なので、
.*\.
最初から2番目の点まですべてが一致します。 - 今、私たちは行の残りの部分に1つの点しかないと確信しています(文字通り点なので、
.*\..*
残りの部分と一致させるのに十分です)。 \(\)
交換時にリサイクルできるように、この残骸を内部に入れ、残り\1
はすべて捨てます。
視覚的な説明:
subdomain.domain.tld
sub1.sub2.domain.tld
`--v----´ `-v--´ `v´
.* \. .* \. .*