Re: [問題] 請教shellscript parse [ 1, 2 ] 中數字
※ 引述《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
10/19 08:35, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 5 篇):