PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   請問正則表示式(regular expression)能做到這樣嗎? (https://www.pcdvd.com.tw/showthread.php?t=971492)

dkjfso 2013-09-02 08:03 PM

1個附加檔案
擷取正則表達式match到的項目
最簡單的方式是..
Emeditor + Perfecta 巨集

goddesschi 2014-07-06 02:38 PM

再請教大家一個問題<(_ _)>
如果透過linux的(du)把資料夾大小/擋案大小抓出來後,能夠用哪個方式把數字的字串過濾出來

舉例

執行
du -s 'folder name or file name'

結果
292980 folder name or file name


我想把292980撈出來再丟給其他的變數
我應該如何把292980過濾出來?

我試過用grep,只能把數字的部份過濾出來而且正則表示不能設定的項ultraedit那般複雜
其餘還嘗試過expr,但是只能針對特定長度的字串取出,因為我不知道長度,如果能支援正則表式
或許還能抓出來
引用:
([0-9]+)\s+\S+


請大家指點一條明路

-----------------------

另外和正則表示無關的一個問題請教一下大家,如果說shell ecript裡面的某個給rar用參數我想依照某個邏輯做內插後丟給shell script的變數,再把那個變數餵給rar用,一般來說大家建議怎麼做

邏輯=
一個excel的table,這個table會有大小對應參數的類似50*2的一個table
每一列就是大小對應參數這樣
根據某資料夾或擋案大小抓到table裡面的某個參數,如果沒有就做內插曲小數點後2位

因為牽涉到linux的指令(du)和運算邏輯(excel)我的想法是把參數echo後用丟給C++(cin)再用二維陣列的方式把table對應的再值取出要不然就做內插(這點還沒有仔細想能不能做到),最後再把結果print出來再丟給shell script的一個變數再讓rar調用這個變數

ex 根據excel的資料寫出一個二維陣列
1000 1.5
2000 2.
3000 3
4000 3.25

input 3200的情況output就是 3+[(3.25-3)/1000]*200
input 3000的情況output就是 3

不知道有沒有人給我點意見,這樣做好嗎?(可行嗎?)還是有其他的建議

老實說我覺得這個問題很麻煩,我光是把字料夾大小dump出來都很研究了很久,又牽涉到C++的陣列恐怕要研究一陣子 = =

darkangel 2014-07-06 02:59 PM

第一個問題,如果要抓指令的制式輸出,可以試試看 awk。此外 grep 的 re 比較陽春,可以用 egrep (or grep -E),當然如果你被我帶壞都用 perl 系的,egrep 還是差了一點點。
第二個問題看不懂你想做啥,先對陣列回答,如果是 C++ 不是偽裝成 C++ 的 C,可以 override operator 做 associative array 或用內建的 map 取代二維陣列,不過如果第一維資料都是純數值那用二維陣列就可以。

yujohn 2014-07-06 03:00 PM

引用:
作者goddesschi
再請教大家一個問題<(_ _)>
如果透過linux的(du)把資料夾大小/擋案大小抓出來後,能夠用哪個方式把數字的字串過濾出來

舉例

執行
du -s 'folder name or file name'

結果
292980 folder name or file name

我想把292980撈出來再丟給其他的變數
我應該如何把292980過濾出來?

我試過用grep,只能把數字的部份過濾出來而且正則表示不能設定的項ultraedit那般複雜
其餘還嘗試過expr,但是只能針對特定長度的字串取出,因為我不知道長度,如果能支援正則表式
或許還能抓出來

請大家指點一條明路


du -s 的結果大小固定是第一個欄位,也許可以用 cut -f1 取得,例如
du -s 'folder name or file name' | cut -f1

goddesschi 2014-07-06 03:12 PM

引用:
作者yujohn
du -s 的結果大小固定是第一個欄位,也許可以用 cut -f1 取得,例如
du -s 'folder name or file name' | cut -f1


好像真的可以直接用cut!!
原以為要用到正則表示來取字串會是比較正規的用法,沒想到網路上都找不到相關的用法,難正則表示不是應用這這種情況 :nonono:

darkangel 2014-07-06 03:15 PM

引用:
作者goddesschi
好像真的可以直接用cut!!
原以為要用到正則表示來取字串會是比較正規的用法,沒想到網路上都找不到相關的用法,難正則表示不是應用這這種情況 :nonono:


你把 cut -f1 換成 awk '{print $1}' 試試 XD
應該一樣,現在手邊沒 linux 沒試,懶得開機。

:laugh: :laugh: :laugh: :laugh: :laugh:

goddesschi 2014-07-06 03:25 PM

引用:
作者darkangel
你把 cut -f1 換成 awk '{print $1}' 試試 XD
應該一樣,現在手邊沒 linux 沒試,懶得開機。

:laugh: :laugh: :laugh: :laugh: :laugh:


的確是一樣的:D

下一步換來試試看能否用shell script -> C++ ->shell script 來實現我上面講的邏輯
若還有任何其他建議,請大家不吝指教 :hungry:

PAN_PAN 2014-07-06 05:38 PM

前年寫過類似的

先變成 array 會簡單一點
http://stackoverflow.com/questions/...ring-into-array

當然如果只是要一行搞定 那可能要 awk

darkangel 2014-07-06 06:38 PM

原來你第二個問題只是要互傳資料,如果你只是要單純在程式與 shell script 中互傳資料,那用 pipe line 就可以輕鬆達到了。
還是推薦 awk 好好玩一下,這是好物,cut, tr 這些很少用,因為一個 awk 就幾乎可以搞定。

goddesschi 2014-07-06 07:35 PM

安裝visual studio 2010中,linux下應該要用g++來compiler吧,我也不會用,之後再爬文看看怎麼弄

暗天使兄說得我大部分都半知半解,需要來研究一下XD

上面我說的隨隨便便的,我再說的詳細一點,我的目的其實是做無人職守分卷壓縮,以前已經有成功"改"了一個半手動的陽春型的腳本湊合著用,但是因為還有一些步驟要手動所以沒加入par2而且有點麻煩,所以不是很滿意這個腳本
而且這次還希望是把par2加入(上面打錯了,主要不是針對rar是par2,而par2的參數要用檔案大小來計算,而我有我自己的一套邏輯來計算所以才有上面的問題)腳本
所以說加入par2和全自動分卷壓縮是我這次修改腳本的目標

http://pastebin.com/0QHPSbb5
所以說基本上是調用一個shell script腳本,以下是腳本大體的流程
1.先針對腳本指定的路徑找到所屬的資料夾找到其下的檔案(N個)
2.針對外部文件中1對1 mapping在rar分卷壓縮的時候命名
3.分卷完之後把所有附檔名改寫

2-3之中因為這次希望另外插入par2的指令來製作修復檔,而修復檔需要以上說的excel參考資料來計算所以要取出該資料夾檔案大小丟到C++上面玩陣列等OOXX(暫訂)在打算完的參數print出來給shell script的par2使用,所以我上面才會說shell script -> C++-> shell script

而3對應到的是77-134行,因為當時懶的寫要怎麼精確計算所以暫訂分卷有150,這個實在是太醜了,我打算用個for迴圈來儘量精化這個流程,還沒具體概念

ps:現在REX我幾乎都是挑perl來用了(但也不是很常用),如果pattern邏輯有問題再說 :D


所有的時間均為GMT +8。 現在的時間是01:46 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。