[英]How to extract the filename and path from sub directories and need to write the output into a csv file using unix shell script
[英]Need to extract a string from a filename
我在臨時表中有一個列,我在其中插入文件名。 文件名的格式如下:
T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in
例子:
T225674_789020161010-0900_12345.in
(我需要從上面的字符串中提取 12345,字符串可以是任何長度的任何東西)
我需要從上面的文件名中提取<TIMBE NUMBER>
,能否請您告訴我們如何在 Oracle SQL 中執行此操作。
謝謝
我確信有一個正則表達式可以做到這一點,但這不是我的強項。 但是,instr 和 substr 的組合會讓你到達那里:
substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1))
@Rene 完美地回答了這個問題,但為了完整起見,這里有一個 Regex_substr 解決方案。
此答案的更改版本。
select
regexp_substr('T225674_789020161010-0900_12345.in', '(.*?_){2}(.*?)\.', 1, 1, '', 2)
from dual
(.*?_){2}
- 第二個下划線之后的任何內容
(.*?)\\.'
- 小數點前的任何內容
為了更加完整(對 user3240704 眨眼),這里有一個更簡單、更有效的正則表達式解決方案。 即使這會比 Rene 的解決方案慢。
使用 OP 提供的信息:要搜索的數字前面是下划線,后面是確切的字符串'.in'
(如果該信息不正確,則解決方案將失敗)。
select regexp_substr(input_string, '_(\d+)\.in$', 1, 1, null, 1) from....
這將搜索下划線,后跟一個或多個數字(\\d 表示數字,+ 表示一個或多個),然后是句點(轉義:. 因為在正則表達式中 . 本身表示“任何字符),然后是 'in ',后跟字符串的結尾 - 因此搜索模式錨定在輸入字符串的末尾。
將\\d+
放在括號中使其成為可以在regexp_substr()
函數中引用的“子表達式”。 第六個參數 1 表示“返回匹配子字符串中第一個子表達式的子字符串”。
regexp_replace
的解決方案:
SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
select 'T225674_789020161010-0900_12345.in' a from dual
)
第一部分(T225674_.*_)
匹配以T225674_
,以_
結尾的任何內容。 然后為接下來的內容留出空間,直到結束組(.in)
:這是第二組(.*)
的目的。
使用regexp_replace
,您可以使用匹配組的內容。 這里我只用\\2
打印組 n°2 的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.