ファイルには次のような線スタイルがあります。
1.2.3.4
1.2.3.4a
1.2.3.45
iaa1.2.3.4ad
11.2.3.4a
a1.2.3.4
1.2.3.4>
<1.2.3.4>
<"1.2.3.4">
1.2.3.4 hostname
すべてのIPを交換したい」1.2.3.4「たとえば、別のIPを使用してください」9.8.7.6'、<>と""で囲まれ、ipの前後に文字が続きます。
しかし、いいえこれ11.2.3.4「または」1.2.3.45'
だから数値 1.2.4.6.7.8.9.10 はすべて一致します。
注:「1.2.3.4」は単なる例であり、有効なIPであれば何でも可能です。
別のIPと交換したいですsed
。1.2.3.4
コマンドを作成する方法がわかりませんsed
。
sed "s/oldip/newip/g"
私は正規表現について少し知っていますが、これは私にとってとても難しいようです。
ありがとうございます。
答え1
有効なIPが含まれていない行について何をしたいのかを話していないので、単に無視したいとします。それからやるべきことは、行全体が1〜3個の数字で構成される3つのセット([0-9]{1,3}
)と一致することを確認し、次に1〜3個の数字で構成される最後のセットと一致することを確認することです。次の3つの方法があります。
GNU sed
sed -r 's/^([0-9]{1,3}\.){3}[0-9]{1,3}$/5.6.7.8/' file
非GNU sed
sed 's/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$/5.6.7.8/' file
パール
perl -pe 's/^(\d{1,3}\.){3}\d{1,3}$/5.6.7.8/' file
答え2
最新のsedを使用すると、次のことができます。
sed -e 's/\(^\|[^0-9]\)1\.2\.3\.4\($\|[^0-9]\)/\1NEWIP\2/'
つまり、行の先頭または数字以外の値の前にある場合はその値に1.2.3.4
置き換え、行の終わりまたは後ろにある場合は数値以外の値に置き換えます。NEWIP
拡張正規表現をサポートしていない以前のsedバージョンの場合、状況はより複雑です。たとえば、マーカー文字を使用してこれを実行できます。入力に現れないようにする2つの文字が必要です。以下のソリューションでは、,
およびhereを使用していますが、:
他の文字、さらには制御文字も可能です。
sed -e 's/\(1\.2\.3\.4\)/,\1:/;s/\([0-9]\),/\1/;s/:\([0-9]\)/\1/;s/,.*:/NEWIP/;s/[,:]//'
最初に置き換えたいパターン,
の前後に挿入し、前に数字がある場合は:
削除し、後に数字がある場合は文字列を置換文字列に置き換えます。残った。,
:
,
:
,
:
Perlを使用すると、否定予測アサーション(?!\d)
と否定予測アサーションを使用して、パターンの(?<!\d)
前後に数字がない場合にのみパターンを一致させることもできます。
perl -pe 's/(?<!\d)1\.2\.3\.4(?!\d)/NEWIP/;'