次の名前の2つのファイルがあります。
ファイル1: RvA_X-IRB-bil-CA101-0+010000-20150327212332-055582-P
ファイル2:RvA_X-IRB-bil-CA101-1+020000-20150327212332-055582-P
私はこのコマンドを使用してファイル名の特定の部分を一致させ、置き換えます。
printf "%s\n" RvA_X-IRB-bil*P | sed -e 's/\(RvA_X-IRB\)-\bil-\(CA.*\)-\0+010000-\([0-9]\{8\}\).*-\([0-9]\{6\}\).*$/mv & \1-\2-\3-\4/'
上記のコマンドはファイル1では正しく機能しますが、ファイル2で動作するようにコマンドを変更すると機能しません。 2番目のファイル名のコマンドは次のとおりです。
printf "%s\n" RvA_X-IRB-bil*P | sed -e 's/\(RvA_X-IRB\)-\bil-\(CA.*\)-\1+020000-\([0-9]\{8\}\).*-\([0-9]\{6\}\).*$/mv & \1-\2-\3-\4/'
唯一変わった部分はまさにこの部分です。\0+010000-\
ベストアンサー1
正規表現を使用すると、次を識別できます。
「RvA_X-IRB-il-CA101-RvA_X-IRB+020000-20150327212332-055582-P」
その理由の1つは、他の人が指摘したように\ 1を使用しているからです。重複した「RvA_X-IRB」を参照してください。
しかし、「\b」も使用することを覚えておくことが重要です。これは、片側に「単語」文字があり、もう一方に「単語」文字がある場合にのみ機能します。https://www.gnu.org/software/sed/manual/sed.html#Invoking-sed
これが意図的なものかどうかはわからないので、「-bil」から「b」を省略しました。実際、あなたのREが最初のケースで動作するという事実に驚きました。たとえば、
echo "-bil" | sed 's#-\bil#GETIT#'
-bil
echo "-il" | sed 's#-\bil#GETIT#'
GETIT
または:
printf "%s\n" RvA_X-IRB-bil | sed 's/\(RvA_X-IRB\)-\bil/GETIT/'
RvA_X-IRB-bil
printf "%s\n" RvA_X-IRB-il | sed 's/\(RvA_X-IRB\)-\bil/GETIT/'
GETIT