2024年10月20日 星期日

Regular Expression, regex

來源: https://tw.alphacamp.co/blog/regex Regex的基本元素 1. 字元匹配 .:匹配任何單個字元(除了換行符\n)。 \d:匹配任何數字,等同於[0-9]。 \D:匹配任何非數字字元,等同於[^0-9]。 \w:匹配任何字母數字字元,包括底線,等同於[A-Za-z0-9_]。 \W:匹配任何非字母數字字元。 \s:匹配任何空白字元(包括空格、製表符、換行符等)。 \S:匹配任何非空白字元。 2. 量詞 *:匹配前面的字元0次或多次。 +:匹配前面的字元1次或多次。 ?:匹配前面的字元0次或1次。 {n}:匹配前面的字元恰好n次。 {n,}:匹配前面的字元至少n次。 {n,m}:匹配前面的字元至少n次,但不超過m次。 3. 位置匹配 ^:匹配輸入字串的開始位置。 $:匹配輸入字串的結束位置。 \b:匹配一個字詞邊界。 \B:匹配非字詞邊界。 4. 字元集 [abc]:匹配任何一個列在方括號中的字元(此例中為”a”、”b”或”c”)。 [^abc]:匹配任何不在方括號中的字元。 5. 分組和引用 (abc):匹配並捕獲括號內的表達式(此例中為”abc”)。 (?:abc):匹配括號內的表達式但不捕獲匹配的字串。 \1:引用第一個捕獲組的匹配內容。 6. 或運算 |:匹配左側或右側的表達式。 Regex的應用範例 範例1:驗證電子郵件地址 假設我們需要確認一個字符串是否為有效的電子郵件地址,我們可以使用以下正規表達式: regexCopy code ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$ ^ 表示匹配開始。 \w+ 匹配一個或多個字母、數字或底線。 ([\.-]?\w+)* 匹配0個或多個由點或連字符後跟一個或多個字母、數字或底線組成的序列。 @ 是字面量字符,匹配”@”。 \w+([\.-]?\w+)* 匹配域名部分。 (\.\w{2,3})+$ 匹配一個點後跟2到3個字母的頂級域名。 範例2:提取日期 如果我們有一串文本,需要從中提取出所有符合特定格式的日期(例如,YYYY-MM-DD),我們可以使用以下正規表達式: regexCopy code \b\d{4}-\d{2}-\d{2}\b \b 表示單詞邊界。 \d{4} 匹配4位數字(年份)。 - 是字面量字符,匹配”-“。 \d{2} 匹配2位數字(月份和日期)。 範例3:密碼強度檢查 為了確保用戶設定的密碼至少包含8個字符,且包含大小寫字母、數字和特殊字符,我們可以使用以下正規表達式: regexCopy code ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ ^ 和 $ 分別匹配字符串的開始和結束。 (?=.*[a-z]) 確保字符串中至少有一個小寫字母。 (?=.*[A-Z]) 確保至少有一個大寫字母。 (?=.*\d) 確保至少有一個數字。 (?=.*[@$!%*?&]) 確保至少有一個特殊字符。 透過這些範例,我們可以看到正規表達式如何在不同場景下提供強大的文本匹配和處理能力。掌握正規表達式不僅能夠幫助你更有效地處理文本數據,還能提升你的程式設計和數據分析技能。隨著練習和應用的深入,你將能夠解鎖正規表達式更多的潛力,將其應用到更廣泛的領域中。 dotAll Flag, /s ES 2019 新增 /s 的標籤,過去 . 可以用來匹配除了換行符號以外(\n, \r)的所有字元: // 過去 . 可以匹配到除了「換行符號」以外的所有字元 console.log(/./.test('\n')); // → false console.log(/./.test('\r')); // → false 過去雖然可以使用 [\w\W] 來匹配到換行符號,但這不是最好的做法: console.log(/[\w\W]/.test('\n')); // → true console.log(/[\w\W]/.test('\r')); // → true 在 ES 2019 中,只要最後有標記 /s 的標籤,如此 . 將也能夠匹配到換行符號: console.log(/./s.test('\n')); // → true console.log(/./s.test('\r')); // → true
#!/bin/csh touch exclude_cell_for_pvt.log foreach CELL_LDB (`ls A.ldb.gz/*.gz | sed -r "s/\x1B\[[0-9;]*[mK]//g"`) echo $CELL_LDB echo $CELL_LDB >> exclude_cell_for_pvt.log zgrep 'exclude_cell_for_pvt' $CELL_LDB | wc >> exclude_cell_for_pvt.log end

2024年10月17日 星期四

Keeping skeleton: remove values in LIB

use strict; use warnings; #輸入檔案和輸出檔案 my $input_file = $ARGV[0]; my $output_file = $input_file.". skeleton"; # 讀取輸入檔案的內容 open my $in, '<', $input_file or die "can't open file $input_file: $!"; my $content = do { local $/; <$in> }; close $in; #使用正規表示式處理跨行的 { ... } 區塊 #$content = s/values\s*\(.*?\); \s*//gs; #移除 vector (ccsp_template2) { } $contents/vector \(ccsp_template2\) {.*?)\s*//gs; #移除 (delay_template_8x8) ( ) $content = s/\(delay_template_8x8\) (.*?)\s*//gs; #移除 (power_template_8x8) ( ) $content =- s/\(power_template_8x8\) (.*?)\s*//gs; #將結果寫入輸出檔案 open my $out, >', $output_file or die "Can't write contents into file $output_file: $!"; print $out $content; close $out; print "Output data to new file $output_file\n";

2024年1月28日 星期日

正規化表示

https://ithelp.ithome.com.tw/articles/10251882 Day 25 正規化表示 在做搜尋條件的時候,有時候想找尋某個檔案,但只記得他的內容關鍵字,這時候正規表示法就非常方便,下關鍵字達到找尋最接近的結果。 grep 全名為 global regular expression print。 [root@localhost ~]# grep [參數] [關鍵字] [檔案或目錄] 參數 -A [行數] (After)顯示符合的那一行,同時顯示該行之後的內容。 -a 以二進位的檔案作為搜尋。 -B [行數] (Before)顯示符合的那一行,同時顯示該行即之前的內容。 -b 顯示符合條件的結果,總共多少 bytes。 -C [行數] (Context)顯示符合的那一行及前後內容。 -c 顯示符合條件的總行數。 -d [動作] 查詢目錄(忽略檔案)。 -E (Extend)使用正則表示式搜尋。 -e [符合條件的內容] 指定搜尋的檔案,通常用在避免partern用-開始。 -F 符合條件的內容作為固定字串的列表。 -f [範本檔案] 指定符合條件的內容,並且將每一行套用樣式。 -G 將樣式視為基本的正規表示法。 -H 在每個符合樣式的行,前面加上符合的檔案名稱或路徑。 -h 同 -H ,但輸出不顯示路徑。 -i (ignore case)不區分大小寫。 -L 不符合條件內容的檔案名稱。 -l 符合條件內容的檔案名稱。 -n (number)顯示符合條件的行數及路徑。 -o 顯示被模式比對到的條件。 -q 不顯示任何結果。 -r 遞迴,讀取每個目錄底下的檔案,同 -d recsuse。 -s 不顯示錯誤訊息或無法讀取的訊息。 -V (Version) 顯示 grep 版本資訊。 -v (recursive)顯示不符合條件的結果。 -w 只顯示文字完全符合的結果。 -x 只顯示全列都符合的列 --help 尋求幫助。 正規表示法特殊字符 正規表示法中的特殊符號,與原意思不相同,他們都有各自使用方式。 特殊符號 說明 ^ 搜尋規則前的「起頭」。意思代表「非」。 $ 搜尋規則後的「結尾」。 . 任意一個字元。 * 任意字元或任意字串,長度可以為0 .* 一起使用代表任意字串。 跳脫字符,將字串中特殊符號的動作去除。 + 一個或多個重複字元 ? 匹配正則表達式的結束行 (n,m) 連續 n 個 到 m個的字串。 < 從比對正則表達式的行開始。 > 到比對正則表達式的行結束。 [] 比對範圍內的字元或字串。 [^] 比對不再指定範圍內的字元。 [-] 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 國際模式比對字符 特殊符號 代表意義 [:alnum:] 英文大小寫字元及數字,亦即 0-9, A-Z, a-z [:alpha:] 任何英文大小寫字元,亦即 A-Z , a-z [:blank:] 空白鍵與 [Tab] 按鍵兩者 [:cntrl:] 鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等 [:digit:] 數字而已,亦即 0-9 [:graph:] 除了空白字元 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵 [:lower:] 小寫字元,亦即 a-z [:print:] 任何可以被列印出來的字元 [:punct:] 標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $... [:upper:] 大寫字元,亦即 A-Z [:space:] 任何會產生空白的字元,包括空白鍵, [Tab], CR 等等 [:xdigit:] 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字元 實際操作 多檔案或目錄搜尋 [root@localhost ~]# grep [參數] [關鍵字] [檔案或目錄1] [檔案或目錄2] [檔案或目錄3] ... 搜尋的關鍵字,以顏色特別標註 --color [root@localhost ~]# grep [參數] [關鍵字] --color [檔案或目錄] 遞迴尋找 root 目錄下的檔案,須符合 美女的字串。 [root@localhost ~]# grep -r "美女" /root/ /root/demo.sh: echo "美女您好"

2023年9月20日 星期三

calculate_sigma

#!/usr/bin/perl
$input_library = $ARGV[0];
$timing_flag=0; $timing_type_flag=0; $get_value_flag=0; $table_count=0;

open(LIB,"<$input_library");
open(NEW, ">hold_sigma.lib") || die "Can not open the file : temp.txt \n";

while(<LIB>){
      print NEW "$_";
      chop $_;
      $table_count++;
      #if(/timing \(\) {/){
  #    #  $timing_flag=1;
  #        #  print "$_ \n";
  #            #}
  #
    if(/timing_type : hold_rising/ || /timing_type : hold_falling/){
        $timing_type_flag=1;
#print "$_ \n";
}
if(/values \( / && ($timing_type_flag=="1")){
$get_value_flag=1; $timing_type_flag=0;
$table_count=0;
#print "$_ \n";
}
    if($get_value_flag==1 && $table_count>0){
        #print "start to get values: $table_count\n";
$_ =~ s/", \\//; $_ =~ s/" \\//; $_ =~ s/"//; $_ =~ s/,//g; #removed unnecessary symbols
@ary=split(" ",$_);
for ($i=0; $i<5; $i++) {
$table_array[(($table_count-1)*5)+$i]=$ary[$i];
}
#print NEW "$_\n";
if($table_count>79){
$table_count=0; $get_value_flag=0; $timing_type_flag=0;
#print NEW @table_array; print NEW "\n";
print NEW "ADD sigma table\n";
for ($j=0; $j<25; $j++) {
$sigma=((($table_array[125+$j]**2)+($table_array[175+$j]**2)+($table_array[225+$j]**2)+($table_array[275+$j]**2)+($table_array[325+$j]**2)+($table_array[375+$j]**2))**0.5);
print NEW "$sigma ";
if((($j+1)%5)=="0"){print NEW "\n";}
}
print NEW "\n";
}
}
}
close(LIB);
close(NEW);

######################################################################

#!/usr/bin/perl                                                                                                                                                                                                    

# input file cell.ldb 
# output add on sigma for mpw

$input_library = $ARGV[0];
$timing_flag=0; $timing_type_flag=0; $get_value_flag=0; $table_count=0;

open(LIB,"<$input_library");
open(NEW, ">mpw_sigma.ldb") || die "Can not open the file : temp.txt \n";

while(<LIB>){
      print NEW "$_";
          chop $_;
              $table_count++;
                  #if(/timing \(\) {/){
                  #    #  $timing_flag=1;
                  #        #  print "$_ \n";
                  #            #}
                  #
    if(/timing_type : min_pulse_width/){
            $timing_type_flag=1;
            #print "$_ \n";
            }
    if(/values \( / && ($timing_type_flag=="1")){
    $get_value_flag=1; $timing_type_flag=0;
    $table_count=0;
    #print "$_ \n";
    }
    if($get_value_flag==1 && $table_count>0){
            #print "start to get values: $table_count\n";
            $_ =~ s/", \\//; $_ =~ s/" \\//; $_ =~ s/"//; $_ =~ s/,//g; #removed unnecessary symbols
            @ary=split(" ",$_);
            #save 5X1 values into a array
            for ($i=0; $i<5; $i++) {
            $table_array[(($table_count-1)*5)+$i]=$ary[$i];
            }
            #print NEW "$_\n";
            if($table_count>15){
            $table_count=0; $get_value_flag=0; $timing_type_flag=0;
            #print NEW @table_array; print NEW "\n";
            print NEW "ADD sigma table\n";
            for ($j=0; $j<5; $j++) {
            $sigma=((($table_array[25+$j]**2)+($table_array[35+$j]**2)+($table_array[45+$j]**2)+($table_array[55+$j]**2)+($table_array[65+$j]**2)+($table_array[75+$j]**2))**0.5);
            print NEW "$sigma ";
            $sigma_plus_nominal[$j]=($sigma*3)+($table_array[15+$j]);
            #if((($j+1)%5)=="0"){print NEW "\n";}
            }
            print NEW "\n";
            print NEW "ADD 3sigma+nominal table\n";
            for ($k=0; $k<5; $k++) {
            print NEW "$sigma_plus_nominal[$k] ";
            }
            print NEW "\n";
        }
    }
}
            
        close(LIB);
        close(NEW);               

2023年8月24日 星期四

AWK

1. 用","當作分隔,取出某一欄位
 cat *.csv | awk -V FS="," '{print $11}'

2. 比較某一欄的值是否大於或小於某個值
使用方法: cat *.txt | awk -f max.awk

BEGIN {
    max = 0.005;
    min = -0.005;
    FS="[,]";
    }
    {
if (FNR > 1) {
    if ($11>max) {
        # print NR;  -->印出行號
        print $0; -->印出該行內容
            }
    if ($11<min) {
        # print NR;
        print $0;
            }
}
}
END {
    printf("max = %f min = %f ", max,min);

3. grep comparison results 
grep -A 2 Pass */*diff.cmp.txt | grep % | awk -F "|" '{print $5}' | xargs



2023年8月11日 星期五

vimdiff


摺疊的命令:
zo : open fold
zc : close fold
zr : reducing folding level
zm : more folding level
zR : reduce completel folding
zM : fold Most

重新計算diff :
:diffupdate or :diffu

同步滾動:
:set scrollbind
:set noscrollbind


標籤