'sed'を使用して10桁の数字シーケンスを1234567890に置き換えたいと思います。
これはうまくいきますが、非常にエレガントではありません。
echo "code=1111111111" | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/1234567890/'
これはうまくいきません
echo "code=1111111111" | sed 's/[0-9]{10}/1234567890/'
結果
code=1111111111
誰でも「sed」を使ってシンプルでエレガントなソリューションを提案できますか?
答え1
sed
デフォルトの正規表現はデフォルトで使用されます。つまり、{10}
プレーンテキストとして扱われます。
以下で確認できます。
echo "code=1{10}" | sed 's/[0-9]{10}/1234567890/'
以下を出力します。
1234567890
あなたの場合は、次のものが必要です。
-E
拡張正規表現を使用するように指定するには、このオプションを使用します。- 次のように脱出
{
して}
ください\{10\}
。
echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
答え2
sed
他の人は、基本的にPOSIXを理解するPOSIX拡張正規表現を使用しようとしていると指摘しました。基本的なよく使われる表現。このオプションを使用すると、ツールの一部(ほとんど)の実装で拡張正規表現を理解できますが、に変更して式を-E
基本式に変更することもできます。{10}
\{10\}
しかし、間違いなく交換したい場合正しい10桁の場合は、入力の他の場所に表示される数字だけでなく、長い数字も一致しないことをお勧めします。
=
入力について詳しく知らずに、文字と行末を一致させて一致を制限します。
sed 's/=[0-9]\{10\}$/=1234567890/'
=
これにより、aと行末の間に現れない長い数字と10桁の数字が一致するのを防ぐことができます。
code
変数(または他の値)の値を変更する必要があることがわかっている場合は、その名前もcode
一致します(ここでは、名前が行の先頭から始まると仮定してその名前をキャプチャします)。\1
重複を減らすために交換として交換):
sed 's/^\(code\)=[0-9]\{10\}$/\1=1234567890/'
答え3
ERE
正規表現スタイルを使用してください。
$ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
code=1234567890
答え4
最初のシーケンス10を交換したい場合そしてそれはすべてです。1234567890 ASCII 10 進数の各行は、次のようにする必要があります。
sed -E 's/(^|[^0123456789])[0123456789]{10}([^0123456789]|$)/\112345678900\2/'
つまり、10桁の数字(実装および/またはロケールに応じて0123456789の代わりに0123456789[0123456789]
の代わりに使用)を置き換えて、先頭の行または数字以外の文字が続き、数字または数字以外の文字が続きます。行末。[0-9]
sed
これはまだまたはまたは1112223334.6
に置き換えられるため、必要な内容と入力に見られる内容に応じて調整する必要があります。1234567890.6
1.0000000000e-2
1.1234567890e-2
0xff0777888999ee
0xff1234567890ee
変えるみんな10の順序そしてそれはすべてです。番号は次のようになります。
sed -E 's/[0123456789]+/\
&\
/g; s/\n[0123456789]{10}\n/123456789/g;s/\n//g'
または次に切り替えることができますperl
。
perl -pe 's/(?<!\d)\d{10}(?!\d)/1234567890/g'
否定予測演算子を使用して、10進数シーケンスの前後に他の数字がないことを確認します。