pretty code

顯示具有 grep 標籤的文章。 顯示所有文章
顯示具有 grep 標籤的文章。 顯示所有文章

2025年3月15日 星期六

grep 待解謎題

為了找出 instance,理論上同樣的 Tcl regex 應該也是可以用在 grep,但結果就是不行?

改用 -P 就可以?

或是拿掉 \] 也可以找出 non escaped identifier?

容我好好想想。


2025/03/15 晚上更新

還不確定為什麼,但知道解決辦法。

此篇文章給了我靈感,] 如果放在第一個字元(不算 ^),可以不需要跳脫符號,如此一來就可以找到那個 escaped identifier cell 了。

目前確定的是 sed 跟 grep 的行為都是一致。


2025/03/16 更新

原來一直都是我在亂用XD

正規表示法我最早學是在 Perl 裡,但只學些皮毛,後來大部分只用 C 後,便很少使用正規表示法。

後來又陸續多學了一些程式語言,直到現在,真的用 Linux 當開發環境,開始大量的使用 grep awk sed 這些好用的工具後,我終於嘗到苦果了XD

這樣也好,趁這個時候把 regex 的一些細節搞清楚。

當我們嘗試用工具或是程式語言來處理正規表示法的時候,第一件事一定要確定該工具或是該程式語言使用的是哪一種正規表示法!

目前比較熱門的大概有 3 派:

POSIX BRE - Basic Regular Expression
POSIX ERE - Extended Regular Expression
PCRE - Perl Compatible Regular Expression

BRE - grep, vi, sed
ERE - awk, egrep

我個人用的比較偏 ERE。

所以我們應該要 follow ERE 的標準。

而我最習慣也最常用的就是 [a-zA-Z0-9] 這樣的描述,在 BRE or ERE 中稱呼這樣的語法為 Bracket Expression

我這裡用 2004 版的 Spec 來描述,英文比較好懂。


從上面我們可以得知:

01. 特殊符號 .*[\,在 Bracket Expression 中不需要 escaped。
02. ] 因為是終止 Bracket Expression 用,有其特殊性,故要 match 它本身時,我們需要將其放在 Bracket Expression 裡的第一個字元,或是在 ^ 後面。

故我應該只要這樣下就可以了,少了跳脫符號,感覺清楚多了。


至於為什麼我在 Bracket Expression 裡面用 escaped  跳脫那些特殊符號也可以,這點我暫時還不知道是在那個 Spec 的條目中可以解釋就是了。

不過重點是,一樣的語法,我在 Tcl 中卻要跳脫,因為 Tcl 用的是一個叫 ARE 的派別,基本上是 ERE 的延伸,我覺得這是用正規表示法最麻煩的地方。

2024年9月15日 星期日

我不喜歡輸的感覺

Web App 最讓人詬病的就是動態產生網頁內容,尤其是用 Javascript 動態產生的,某種程度上都會大大增加 parsing 的困擾。

有時候只想快速得到一個結果,我還得先用一個類瀏覽器的函式庫取得內容,這不是我喜歡的解決問題方式。

以前曾在網路上看到某位號稱新店寶橋路正規表示法第一的網友,我決定來效法他的作法。

先點選小老婆 Top 50 撥放清單任一首歌,接著使用 Chrome 檢查功能進到 Elements 頁面,在 html tag 處按下滑鼠右鍵 -> Copy -> Copy element,將複製內容另存檔案為 Top_50.txt。


然後就沒有然後了。  

grep -E 'h3 .*aria-label' Top_50.txt | sed -En 's/^\s*<h3.*aria-label="(.* )上傳者.*">/\1/p'


01.郭静 - 陨落(电影《大红包》告白推广曲) (动态歌词) 
02.郭靜 - 夢在遠方 
03.今天起 
04.【純享版】尤長靖/郭靜《氧氣》 治癒系嗓音隔空吟唱太好聽!《天賜的聲音》ep7 純享版no noice /浙江衛視官方hd/ 
05.郭靜 claire kuo - 在樹上唱歌 (官方版mv) 
06.郭靜 claire kuo - 軟綿綿 (官方版mv) 
07.郭靜 - 像我這樣 
08.郭靜 claire kuo - 還有什麼好在意 whatever (官方版mv) 
09.郭靜 claire kuo - 回憶的閣樓 memories of us (官方版mv) 
10.郭靜 claire kuo - 該忘的日子 i am moving on (官方歌詞版) - 韓劇《雲畫的月光》片尾曲 
11.郭靜 claire kuo【深呼吸 take a breath】official lyric video 
12.郭靜 claire kuo - 想個不停 (官方版mv) 
13.郭靜 claire kuo - 不想有遺憾 don’t wanna miss you (官方歌詞版) - 衛視中文台戲劇「長不大的爸爸」插曲 
14.相思弦 
15.逆行的減法 
16.触碰你 
17.在曾有你的地方 
18.郭靜《只為遇見你》【只為遇見你 nice to meet you ost電視劇片頭曲】官方動態歌詞mv (無損高音質) 
19.像风 
20.單身美好 
21.我的小森林 
22.郭靜 claire kuo - 簡單 (官方版mv) 
23.愛情模樣 
24.沙漏 (網劇ᐸ時光教會我愛你ᐳ插曲) 
25.類似快樂的信 (電視劇《戀戀小酒窩》片尾曲) 
26.又是艷陽天 
27.郭靜 claire kuo【消耗寂寞 leave me hanging】official lyric video 
28.悸動 
29.亲爱的你 郭静 [动态歌词/lyrics] 
30.我想要有人為我傷心 
31.算不算 
32.『溫柔女聲』郭靜(guo jing)-拜你所傷(bai ni shuo ci)【我就祝福你,幸福快樂。】#流行歌曲 #動態歌詞 #lyrics #高音質 #好聽 
33.郭靜《一個人勇敢》【我的時代, 你的時代 go go squid2 dt / appledog's time ost電視劇插曲】官方動態歌詞mv (無損高音質) 
34.郭靜 claire kuo - 何日君再來(官方歌詞版)- 電視劇《回家》插曲 
35.郭靜 claire kuo - 小聲音 (官方版mv) 
36.郭靜claire kuo《我非獨自生活》官方版mv 
37.郭靜 claire kuo - 可惜 (官方歌詞版) - 中天電視劇「何以笙蕭默 」片頭曲、 民視偶像劇「星座愛情」獅子女片尾曲 
38.郭靜 claire kuo - 我不是你的那首情歌 not meant to be together (官方版mv) 
39.郭靜 claire kuo - 拍檔 partners (官方版mv) - 電視劇《後菜鳥的燦爛時代》片頭曲 
40.郭靜 claire kuo - 別去問他好嗎 don't let him know (官方版mv) 
41.郭靜 claire kuo - 忘了如何遺忘 how to forget (官方版mv) - 電視劇《聶小倩》片尾曲 
42.郭靜 claire kuo - 每一天都不同 (官方版mv) 
43.郭靜 claire kuo - 明白 (官方版mv) 
44.他爱的梦 
45.《陪你逐風飛翔 to fly with you》郭靜 claire kuo - 越走越遠 farther and farther🥀(英繁中文歌詞 eng lyrics)🤍陪你逐風飛翔 情感插曲 ost 
46.郭靜  claire《慶幸遇見你》【我可能遇到了救星 hi venus ost 電視劇插曲】official lyric video 
47.(mv) 郭靜 (guo jing) - 月亮會記得(yue liang hui ji de) (the moon will remember) ost. 小女霓裳 aka ni chang 
48.最精彩的豔遇 
49.郭靜 claire kuo《暖橘》【我的助理不簡單 never too late ost 電視劇插曲】official lyric video 
50.DuDu好 

最後在聽到第 26 首歌《又是艷陽天》時,搞定此事並寫完更新 Blog

2024/09/15 洗完澡更新

洗澡時才想到忘記補上今天現學現賣的技巧,使用 VIM 在每列前面補上 index。

雖然我也可以都用 VIM 搞定,但我現在只能想到 .recording 2 種方法,操作起來沒有那麼漂亮,故我還是拆成三動來記錄。

01. 先把上面抓到的歌名另存一個檔案,比如 Final_50.txt。 
02. Sed -Ei 's/(.*)/1. \1/g' Final_50.txt
03. 從第 2 列開始,使用區塊模式選取 1 這一個 column,可以用 ctrl + v + G 一口氣選取,然後按下 g + ctrl + a,便會幫每一列的數字自動加 1。
04. Sed -Ei 's/^([0-9]+{1,1}\..*)/0\1/g' Final_50.txt,這裡是幫 1 ~ 9 前面補上 0。

現在就剩下如何都用 VIM 搞定,我猜應該是朝自動向下填入方向去找尋對應指令。

2024/09/16 更新

殘念,這個增加數字的技巧是從 VIM 7.4.754 版本才開始,我們家的工作站版本居然比這還舊?不支援 true color 也就算了,什麼都沒有是怎樣!

另外,對於我這種 parsing 需求來說,也許使用油猴也是個不錯的選擇,改天再來嘗試。

2024/09/21 更新

其實小老婆好聽的歌還可以再追加幾首,有 50 幾首合我口味的歌,真是不簡單呀。

昨天從下午 1:30 開始就邊聽 Top 50 邊 review 這幾天寫的文件,一直到下午 4:30 才聽到《在曾有你的地方》,3 個小時也還聽不到 40 首,不知道為什麼開車時卻覺得很快就輪回一輪了?要不是顧及老婆感受,我應該可以一直聽這歌單不會膩吧XD

另外一個撥放清單的歌混合了我從前到現在聽過覺得好聽的歌,各國語言都有,到目前也才 157 首,一樣可以用我上面 regex 的技巧取出歌名,但在複製 HTML 時,要記得自己用滑鼠拉到最後,不然預設好像只顯示 100 首,另外最後面可能會有幾首是 YouTube 推薦的,但因為是同 CSS 設定,故目前無法有效過濾,也許得用 VIM 手動砍掉推薦影片後面的 HTML 吧。

2024年7月31日 星期三

2024 week 31 新玩意

01. SRAM

M x N

M depth,  M words of memory.
N width,  bits per word.

SRAM 4096X96

wire [95:0] D;
wire [95:0] Q;
wire [11:0] Adder;
reg [95:0] ram[4095:0];

 2^12 = 4096, 12 is the address line width.

Column mux is used to reduce the length of row (4096), it can reduce the area of SRAM ( 讓 SRAM 長寬不要差太多,也可以增加效率 ).

SP means single port SRAM, the port can be used to read or write function.
    clk, addr, en, wen, data.    

2P means two port SRAM, one port for read, one port for write.
    clk_r, clk_w, addr_r, addr_w, en_r, en_w, wen_r, wen_w

DP mean dual port SRAM, two port for read or write function.
    clk_a, clk_b, addr_a, addr_b, en_a, en_b, wen_a, wen_b
    you can read or write at addr_a or addr_b.

02. \d is for PCRE, not for basic regex.

We can use -P when we use grep. 

還好我都習慣使用 [0-9],但偶爾會突然想用 \d,每次都會忘記是 for PCRE。

2024年7月10日 星期三

2024 week 28 新玩意

01. 工作站 grep

假設我要找 cell,但不要 .db 的檔案。

grep -r pattern --exclude="*.db"

也可以正向表列

grep -r pattern --include="*.lib"

至於為什麼要加上雙引號?那是因為整個指令傳給 grep 時,*.lib 會被 shell 轉譯過一遍,所以會造成問題,因此要加上雙引號或單引號。

不過照連結所述,當前目錄如果沒有 .lib 檔案應該是要沒問題的,我不確定是否是工作站 grep 版本過舊導致。


晚上用 Windows 11 WSL - Ubuntu 22.04.2 LTS 試了一下,確實是不用加上星號,看來是版本問題?


2024/07/12 更新

更精確來說,既然問題是出在被 shell 過了一手,那應該是 shell 版本的問題,工作站使用的是 tcsh,在我改用 bash 後,這個問題就消失了。

為了之後工作效率著想,以後不管是 glob or regex pattern,最好都用雙引號框住,才不會在急著需要做甚麼事的時候又出問題。

晚上在 WSL 裝了 tcsh 6.21.00,不加上雙引號仍然會有問題,開始懷疑是 tcsh 的 feature 了XD



02. Yosy 執行方式

Yosys 總共有好幾種執行方式:

Run directly
直接執行,手動下 command。

-c *.tcl ( refer to tcl command )
將指令寫在 tcl script 中,最前面要加上 yosys -import,才可以執行 yosys command。

使用這個模式的好處是可以用 tcl 語法,靈活性最大。

-s *.ys ( refer to script command )
將指令寫在 script 中,與 -c 差別在不需要 yosys -import 就可以執行 yosys command。

也因為不是走 tcl callbak,故整個檔案的解析都在 run_frontend 這個函數中。

yosys *.ys
同上,會在 run_frontend 中,執行 default auto command 並靠副檔名決定執行 script command。

嚴格來說上面兩個 run_frontend 執行的地方不一樣,這裡是在 while (optind < argc) 的敘述裡。

yosys xxx
因為沒有副檔名可供判斷,故在 run_frontend 中便會報錯。


03. 工作站 Shell

因為 EDA tool 緣故,大部分工作站預設的 Shell 都是跑 csh(tcsh)。但是自己寫的 Shell script,如果第一行沒有指定 Shell,則預設是跑 bash。

我想一般人應該都是比較熟悉 bash 吧?我不確定此行為是我們工作站獨有,還是 Linux 都是這樣?不過經我剛才在 WSL Ubuntu 上 22.04 實測,看起來未指定第一行會以預設 Shell 來執行。


04. alias 進階用法


雖然我後來才知道有 realpath 這個外部 command 可用,但當初想知道如何用 awk 達成此目的,也算在 shell script 中撞了一堆坑,故想要留下個記錄。以後凡事還是要先 Google,畢竟你的需求別人應該也早就碰到過了,很多事應該不用都自己來才合理。

話說回來,想要用 alias 包裝 command,遇到像雙引號或是 $ 這種特殊符號,就是用接續的方式來處理指令。

畫橘色線的是一個一個串接指令的字串,雙引號和 $ 是直接在 Shell 中,故要加上跳脫字元。

我這裡用的 shell 是 bash,tcsh 也是同樣的道理,差別在 alias 語法不是用等號而是空白。

2024/07/19 更新

晚上實測一下,realpath 無法接受 pipeline,故也不是萬能!

想要在當前目錄下找 Cell Library - realpath *.lib
想要用 grep 遞迴搜尋 Cell name - 還是只能用 awk 也就是這邊用的 alias ($9 改 $1 比較通用,有需要再用 awk 切一次)方式。

2024年5月28日 星期二

2024 week 22 新玩意

關於 Verilog 好像有一些領悟,但對於 timing 的 coding 還是覺得說不上哪裡怪?希望之後能有機會補充這些知識。

01. grep in Makefile

對於 grep 來說,有搜尋到東西 status 是 0,沒有則是 1,也就是會反映到 $? 這個 shell 變數。

如果在 Makefile target 中有呼叫 grep 做些事情,如果是找不到,Makefile 就會報 Error,如果這個 grep 只是做檢查用,記得加上 "-grep",這樣 Makefile 便會忽略錯誤繼續執行。

02. \n in VIM

對於 search,\n is \n。
對於 replace,\n is \r。


03. Flexlm Server

Flexlm 是 EDA 廠商使用的授權管理軟體伺服器端,EDA tool 利用此機制檢查是否有授權,一般使用者會設定 License Variable 為某台主機,這樣就可以使用該套軟體。

2022年4月19日 星期二

grep 多行匹配

換行字元 pattern 為 \r or \n。

grep -Pzo "pattern" file

2019年1月25日 星期五

grep 小技巧

目前因為測試
故手上有好幾千筆的開機資料

正常情況下只要 parse 一次即可
故時間還可以接受

但是如果要測試 Server 的功能時
這幾千筆的資料便會拖慢測試速度

grep 有一個參數可以方便我們擷取前幾筆的資料
這樣一來就可以產生出可供人工使用的測試資料了
輸出控制:
  -m, --max-count=NUM       在達到 NUM 符合項目後停止

Usage:
grep ".*" --text -m 30000 Reboot.log > test.log

2018年2月26日 星期一

grep binary 檔案

使用 grep parse log 時
如果 log 裡面有非 ASCII 字元時,比如說 0x00
此時 grep 會誤認為檔案為 binary 檔案
故無法 line by line 顯示

此時只要簡單加上 --text 選項即可

2016年7月22日 星期五

grep examples

# 挑出超過 1000 ms 的資料
110.txt: 100%    800 (longest request)
111.txt: 100%   2538 (longest request)
112.txt: 100%   1209 (longest request)
113.txt: 100%   2341 (longest request)
114.txt: 100%    829 (longest request)
115.txt: 100%   2506 (longest request)
116.txt: 100%    829 (longest request)
117.txt: 100%   2372 (longest request)
118.txt: 100%    862 (longest request)
119.txt: 100%   5681 (longest request)
120.txt: 100%    803 (longest request)

ANS: grep -E "%\s{3}\S"
前面一定要加入 % ,不然就如圖片所示,有 4個空白的列也會符合。