>Friends,
我正在尝试生成动态 sql 脚本并从原始查询结果中替换字符串。
Original: '/u02/DB/FILE/file01.dbf' or
Original: '+DATA/DB/FILE/file01.dbf'
Required : '/u01/data/dbname/file01.dbf'
- 从原始字符的第 2
- 个字符开始搜索,找到"/"的第 1 个和第 2 个出现并替换为数据(希望这涵盖了两个原始场景(
- 从原始字符的第 2 个字符开始搜索,找到第 2 个和第 3 个出现的"/"并替换为 dbname
原始的DB和FILE可以是任何位置,因此无法真正对其进行硬编码。
我在下面使用以下命令将 FILE 替换为 dbname,但这并没有完全帮助,
不知何故,感觉方法太复杂了,应该有更好/不同的方法。
SELECT 'alter database rename file ''' || f.file_name || ''' to '''|| '/u01' ||
REGEXP_REPLACE(SUBSTR(f.file_name, INSTR(f.file_name, '/',2)), '/FILE/', '/dbname/', 1||''';' stmt
FROM ( SELECT name file_name, bytes
FROM v$tempfile
ORDER BY bytes ESC
)f;
谢谢,非常感谢。
您可以使用单个正则表达式替换操作:
^([^/]*/[^/]*/)[^/]*/[^/]*
替换为 1data/dbname
。
详
-
^
- 匹配字符串的开头 -
([^/]*/[^/]*/)
- 组 1(使用替换模式中的1
反向引用引用(:-
[^/]*
- 除/
以外的 0+ 个字符 -
/
- 斜杠 -
[^/]*
- 除/
以外的 0+ 个字符 -
/
- 斜杠
-
-
[^/]*
- 除/
以外的 0+ 个字符 -
/
- 斜杠 -
[^/]*
- 除/
以外的 0+ 个字符
快速在线测试:
select regexp_replace('/u02/DB/FILE/file01.dbf', '^([^/]*/[^/]*/)[^/]*/[^/]*', '1data/dbname') AS RESULT from dual