Re: [問題] 請教shellscript parse [ 1, 2 ] 中數字

看板Linux作者 (慘)時間12年前 (2011/10/19 05:59), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/5 (看更多)
※ 引述《ptthidebear (= =)》之銘言: : 標題: [問題] 請教shellscript parse [ 1, 2 ] 中數字 : 時間: Mon Oct 17 10:04:40 2011 : : : Hi~ 各位板大先進大家好 : : 小弟對於shell script 不是很熟悉 : : 最近剛好碰到一個問題是 想要用shell script parse 字串 : : "asdfwer [ 1234, 3456 ]" 中的 1234 和 3456 出來 : : 並且加以比對看數字是不是一樣 : : 當然希望最好是一行 command就可以解決...|||Orz grep有問題,不用grep,一行指令如下: (Windows平台) cat %filename% | cut -d[ -f2 | cut -d, -f1 | sed "s/ //g" > n1.txt & cat %filename% | cut -d, -f2 | cut -d] -f1 | sed "s/ //g" > n2.txt & diff n1.txt n2.txt && echo number1 is number2 || echo number1 is not number2 %filename% 請改成真正的檔名 把&拿掉, 其實是三行指令啦! ^^" 都用GNU的指令, 要弄到別的平台應該很容易修改吧!? GnuWin32下載網址: http://gnuwin32.sourceforge.net/packages.html http://sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0/coreutils-5.3.0.exe/download (for cat,cut) http://sourceforge.net/projects/gnuwin32/files/sed/4.2.1/sed-4.2.1-setup.exe/download (for sed) http://sourceforge.net/projects/gnuwin32/files/diffutils/2.8.7-1/diffutils-2.8.7-1.exe/download (for diff) 如果不能隨便安裝主機, 只要複製bin資料夾出來即可使用. 把bin資料夾設定到Path環境變數, 或切換到bin資料夾執行指令. (用絕對路徑執行指令當然一定可以) : : : 不知道各位大大們對於這個問題有沒有什麼建議或是指教的 : : 非常謝謝大家!!! : : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.123.105.206 : 推 bitlife:grep -o '[0-9]*' 10/17 10:28 : → ptthidebear:感謝大大~ 不過出來的結果是空的 XDa" 10/17 10:34 : → bitlife:你要把你的文字內容當成上一行的輸入,不論是pipe或是直接 10/17 10:47 : → bitlife:加檔案名稱在命令的最後面 10/17 10:48 : → bitlife:上面的命令是只抓出數字,如果你還要進一步比對,要再多做一 10/17 10:49 : → bitlife:事. 不過因為對你的資料來源內容一無所悉,所以也無法給你 10/17 10:50 : → bitlife:明確命令,不過原則是用 bash read 和 test 來做. 10/17 10:51 : → ptthidebear:我是用cat test.txt | grep -o '[0-9]*' 10/17 10:54 : → ptthidebear:test.txt內容就是原文裡面的例子 10/17 10:54 : → OpenSolaris:ㄧ定要ㄧ行嗎?搞成一行串在一起的都很難想,不直觀. 10/17 10:58 : → ptthidebear:想請教大大如果不是一行的話...有什麼其他想法嗎@@? 10/17 11:10 : → ptthidebear:因為有特殊需求所以儘量得在一行完成...Orz 10/17 11:12 : → bitlife:我試了你的資料,會產生出兩列數字,你沒產生嗎? 10/17 11:48 : → bitlife:如果一定要一行完成,最好的方法是寫個C程式 10/17 11:48 : → ptthidebear:cat test.txt | grep -o '[0-9]*' 出來結果是空的 10/17 12:34 : → bitlife:這就腫了,難不成我們的 grep 版本產很多? 10/17 12:36 : → bitlife:差很多 10/17 12:37 : → bitlife:你man grep看看有沒有 -o 的說明? 10/17 12:37 : → ptthidebear:有呀~我剛剛跑不出來就man了一下 -o, --only-matching 10/17 14:18 : → ptthidebear:grep (GNU grep) 2.5.1 10/17 14:19 : → kdjf:test.txt裡面檢查一下東西還在嗎? 10/17 16:00 : → ptthidebear:都還在@@" 我剛剛試另一個test file 內容只有數字 10/17 16:06 : → ptthidebear:12345 然後 cat test2.txt | grep -o '[0-9]*'有出現 10/17 16:07 : → ptthidebear:12345沒錯... 10/17 16:07 : : : : [root@Acer xxx]# cat test1.txt : asdfwer [ 1234, 3456 ] : [root@Acer xxx]# cat test1.txt |grep -o "[0-9]*" : [root@Acer xxx]# cat test1.txt |grep -o "[ [0-9]*, [0-9]* ]" : [ 1234, 3456 ] : [root@Acer xxx]# cat test2.txt : 12345 : [root@Acer xxx]# cat test2.txt |grep -o "[0-9]*" : 12345 : [root@Acer xxx]# : : : 以上是我測試的結果...會不會pattern不match的關係@@? : : : ※ 編輯: ptthidebear 來自: 140.123.105.206 (10/17 16:12) : → bitlife:我的 grep 是 GNU grep 2.5.4, 莫非是版本問題? 10/17 16:30 : → bitlife:建議先更新 grep 版本,你的執行結果看起來像是 bug. 10/17 17:34 grep -o "[0-9]*" 在舊版真的有問題 GNU grep 2.5.1 -> 無法顯示數字, 錯誤 GNU grep 2.5.4 -> 可以顯示數字, 正確 : → ptthidebear:可能沒辦法耶,因為就是要在這個平台上跑... 10/17 19:04 : → ptthidebear:我沒辦法控制這些版本Orz 10/17 19:04 : → Holocaust123:那就把grep裝在家目錄然後修改path讓該grep在前面吧 10/17 21:01 : → bitlife:我是覺得寫個C程式最快.一般熟C程度寫好應該不用10分鐘. 10/17 21:15 : → ptthidebear:謝謝各位,我想另外寫個小程式解決它了~:) 10/17 23:30 : 推 qsort:why not python? 10/18 02:01 : → OpenSolaris:Why not tcl? 10/18 09:16 : 推 kira925:Perl is your friend 10/18 09:59 : → bitlife:還有php也可以用.XD 就看原po熟哪種就是了. C是最快,原po 10/18 10:03 : → bitlife:有速度考量的話,用C最好. 10/18 10:03 : → ptthidebear:我是想用C,不過可能會跨平台,所以應該會用python 10/18 10:24 跨平台是指Windows嗎? 實驗測試如下: c:\bin>cat test01.txt asdfwer [ 1234, 3456 ] c:\bin>cat test01.txt | cut -d[ -f2 | cut -d, -f1 | sed "s/ //g" > n1.txt & cat test01.txt | cut -d, -f2 | cut -d] -f1 | sed "s/ //g" > n2.txt & diff n1.txt n2. txt && echo number1 is number2 || echo number1 is not number2 1c1 < 1234 --- > 3456 number1 is not number2 c:\bin>cat test02.txt asdfwer [ 1234 , 1234 ] c:\bin>cat test02.txt | cut -d[ -f2 | cut -d, -f1 | sed "s/ //g" > n1.txt & cat test02.txt | cut -d, -f2 | cut -d] -f1 | sed "s/ //g" > n2.txt & diff n1.txt n2. txt && echo number1 is number2 || echo number1 is not number2 number1 is number2 c:\bin> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.121.216.128

10/19 08:35, , 1F
感謝大大~ 我是Linux平台~
10/19 08:35, 1F
文章代碼(AID): #1EdVRV-I (Linux)
討論串 (同標題文章)
文章代碼(AID): #1EdVRV-I (Linux)