パターンマッチングとパターン削除のためのsedの使用

パターンマッチングとパターン削除のためのsedの使用

次の名前の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

関連情報