使用 sed 进行模式匹配和删除该模式

使用 sed 进行模式匹配和删除该模式

我有两个文件,其名称如下:

文件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

相关内容