0

次のperl1ライナーコードのターゲットは、最初の3つのオクテットを置き換えることです(4つのオクテットが数字/数字の場合-xxx.xxx.xxx.digit)

  • 備考-私はLinuxとsolarisのマシンを使用しています

問題は、4オクテットIPが有効なIPオクテットではないのにperlワンライナーが最初の3オクテットも置き換えることです(たとえば5.5.5.555)

次のperlonelinerコード例は、4つのオクテットが有効なIPではないにもかかわらず、perl構文が最初の3つのオクテットをどのように置き換えたかを示しています。

# export OLD_IP=1.1.1
# export NEW_IP=5.5.5
# echo 1.1.1.555 | perl -i -pe 'next if /^ *#/; s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d)/$ENV{NEW_IP}/g'
5.5.5.555

最初の3つのオクテットを置き換えるために、perlの1つのライナーコードに何を追加する必要があるかをアドバイスしてください

4オクテットが有効なIP(0〜255)の場合のみ

4

3 に答える 3

0

eval置換にフラグを使用する簡単な解決策は次のとおりです。

perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 < 255 ? "5.5.5.$2" : $1/ge'

テスト:

echo 1.1.1.12 | perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 < 255 ? "5.5.5.$2" : $1/ge'
5.5.5.12

echo 1.2.1.256 | perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 <= 255 ? "5.5.5.$2" : $1/ge'
1.2.1.256
于 2013-03-01T13:24:07.390 に答える
0

最後のオクテットが常に1桁の場合は、パターンの開始時と同じように実行し、最初のオクテットの後に桁がないことを確認できます。

s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d(?!\d))/$ENV{NEW_IP}/g

この方法は、0から255までの有効な最終オクテットをチェックするよりもはるかに簡単です。

s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d))/$ENV{NEW_IP}/g
于 2013-03-01T10:40:17.823 に答える
0

私の最初の考えは、正規表現を使用することです。

次の式で開始する必要があります。1桁の0から9、2桁の0から9、1から始まる3桁、2から始まるが5が続かない3桁、3桁が続く5が5に制限されているさまざまなグループをチェックします。 3桁目

^(?:[23456789]|[0123456789][0123456789]|1[0123456789][0123456789]|2[01234][0123456789]|25[012345]?)$

オンライン正規表現テスターでテストしましたが、うまくフィルタリングされているようです

私のPERLに関する知識は、12年以上前からありますが、出力を取得してその値を確認することはできないはずです。

/\d\.\d\.\d\.(\d)/ if $1 < 255
于 2013-03-01T10:45:15.493 に答える