固定長16進アドレスに一致するsedの正規表現パターン

固定長16進アドレスに一致するsedの正規表現パターン

固定長の16進アドレスと一致するようにsedで正規表現パターンを使用したいと思います。たとえば、

0x000000010b2e993c

0x常に存在し、その後に16文字の16進数が続きます。これは成功です:

's/0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]//'

16番を0x使用できる短縮方法はありますか?[0-9a-f]

答え1

sed 's/0[xX][[:xdigit:]]\{16\}//g'

基本正規表現を使用した標準構文です。

sedこれで、ほとんどの実装では、次に切り替える-Eオプションがサポートされます。拡大する正規表現¶:

sed -E 's/0[xX][[:xdigit:]]{16}//g'

[[:xdigit:]][0123456789abcdefABCDEF][0-9a-fA-F]0と9、aとf、またはAとFの間で順序付けされた他の何百もの文字と一致する必要はありません)と同じです。

とにかくにはが0x01234567890123456789含まれている0x0123456789012345ために置き換えられます6789

0x<16-hex-digits>後に他の16進数がない場合にのみ置き換えるには、次のものを使用できますperl

perl -pe 's/0x[0-9a-f]{16}(?![0-9a-f])//gi'

(?!...)否定予測アサーション演算子は、通常サポートされている正規表現では使用できませんsed(ast-opensedは例外です)。ロケールに関係なく、0123456789とabcdefのみが一致しますが、perl [0-9]必要に応じてそこでも使用できます。[a-f][[:xdigit:]]

追加sed実装サポート単語の境界演算子ですが、構文は実装ごとに異なります。

  • \bperl
  • \<\>ex/vi
  • [[:<:]][[:>:]]一部のBSDでは

一部のsed実装では、大文字と小文字を区別しないように、またはiフラグをサポートしています(たとえば、GNUを使用)。Iperlsed

sed -E 's/0x[[:xdigit:]]{16}\b//gi'

良い:

perl -pe 's/0x[0-9a-f]{16}\b//gi'

0x<16-hex-digits>後に単語文字(数字または下線)がない場合は、次の単語境界が削除されます。


最初は、基本正規表現と拡張正規表現の両方\{x[,y]\}/{x[,y]}演算子はありません。一貫性のために\{...\}最初にBREに追加し、次に{...}ERE(POSIXによって駆動されます)を追加しますが、以前に指定されていないBREの動作とは異なり、以前のバージョンとの互換性が壊れているため、間違いなくしばしば追加します\{...\}。一部awkまたはegrep実装では、まだこれを実行せず、サポートされていません。

関連情報