私は初心者なので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