sed: FQDN の後のドットからすべてを削除します

sed: FQDN の後のドットからすべてを削除します

私は初心者なのでsed、うまく動作させるのに苦労しています。

私が欲しいのはこれです:

abc.ztx.com. A 132.123.12.44 ---> abc.ztx.com

以下のパターンを使用しましたが、機能しないようです:

echo "abc.ztx.com. A 132.123.12.44" | sed 's/\.\s.+//g'

regex101.com とパターンを使用して正規表現を検証したところ、\.\s.+部分が. A 132.123.12.44完全に一致しています。 ではなぜ機能しないのでしょうかsed

ご協力に感謝します。ありがとうございます。

答え1

sedデフォルトでは、POSIX 基本正規表現 (BRE) を使用します。 \sは PCRE (Perl 互換正規表現) で、BRE と同等です[[:blank:]](スペースとタブに一致するか、または[[:space:]]より大きな空白文字のセットに一致する可能性があります)。 はPOSIX 拡張正規表現 (ERE) 修飾子で、 BRE+と同等です。\{1,\}

だから試してみて

sed 's/\.[[:blank:]].*//'

[[:blank:]]代わりに、タブを一致させる必要がない場合は、スペース文字に置き換えることができます。

sed 's/\. .*//'

フラグによる置換は不要でgあることに注意してください。一致するのは 1 つだけです。また、.+使用する は、他に文字があるかどうかは関係ないため.*、 の代わりに に置き換えることができます.\{1,\}(すべて削除するだけです)。

関連している:

答え2

Gnu/Linux またはその他の Gnu を使用している場合は、Gnu sed が存在します。Gnu sed には-r、これを可能にするオプションがあります。

-r正規表現の方言を変更するオプションを追加します。

例えば

echo "abc.ztx.com. A 132.123.12.44" | sed -r 's/\.\s.+//g'

答え3

あなたの質問は具体的に について尋ねていますsedが、私はcutこれに を使用します。

末尾のドットを許容できる場合は、次のようになります。

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1

abc.ztx.com.

末尾のドットが許容できない場合は、次のようにします。

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | rev | cut -d. -f2- | rev

abc.ztx.com

または:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | sed -e "s/\.$//"

abc.ztx.com

答え4

awkフィールド区切り文字として.(ピリオド + スペース) を指定してを使用する別の方法もあります。

echo "abc.ztx.com. A 132.123.12.44" | awk -F '\\. ' '{print $1}'

abc.ztx.com

関連情報