我有两个文件,其名称如下:
文件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 工作时,它不起作用。第二个文件名的命令如下:
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 。请注意重复的“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