sed 正規表現が機能しない

sed 正規表現が機能しない

正規表現は、最後に0が追加された長さ46の数字または小文字を検索します。

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | sed -e 's/[0-9a-z]{45}/\10/g'
sed: -e expression #1, char 20: invalid reference \1 on `s' command's RHS

grepが動作する場所

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | grep -E '[0-9a-z]{45}'
"0020000000000000100000000000000000000000000001"

バージョン:

C:\Users\svuppula>sed --version

sed (GNU sed) 4.2.2

C:\Users\svuppula>grep --version

grep (GNU grep) 2.24

ベストアンサー1

\1かっこ内の最初のグループを表しますが、あなたはそうではありません。括弧を追加するか、一致&文字列全体を入力します。

$ echo "foobar" | sed -e 's/foo/&ABC/'
fooABCbar
$ echo "foobar" | sed -re 's/(foo)/\1ABC/'
fooABCbar

-rGNU sedでは括弧を使用し、数{NN}も一致する必要があります。 (すべてのアイテムに見苦しいバックスラッシュエスケープを使用したくない場合)

だから:

echo "0020000000000000100000000000000000000000000001" | sed -re 's/([0-9a-z]{45})/\19/g'
00200000000000001000000000000000000000000000091

数値文字列の長さは46文字ですが、正規表現は45文字のみと一致するため、最後の数字の前に9文字が追加されます。正確に45文字の行のみを処理するには、正規表現を行の先頭と末尾に固定します。

$ echo "002000000000000010000000000000000000000000001" | sed -re 's/^[0-9a-z]{45}$/&9/g'
0020000000000000100000000000000000000000000019

(入力に0が混在しないように9に追加した数字を変更しました。)

おすすめ記事