bash shell 無法使用 perl 正則

来源:https://www.cnblogs.com/edisonfish/archive/2023/04/15/17320561.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚。今天跟大家分享一個關於正則表達式的案例,希望能夠對你有所幫助 案例現象 前幾天有一個小伙伴在群里求助,說他這個 shell 腳本有問題,讓大家幫忙看看 可以看到,這個腳本首先將目標文本文件的名字當作該腳本的第一個參數($1)傳遞進去,然後查看這個文本文件的內容(cat $1), ...


 

 哈嘍大家好,我是鹹魚。今天跟大家分享一個關於正則表達式的案例,希望能夠對你有所幫助

案例現象

前幾天有一個小伙伴在群里求助,說他這個 shell 腳本有問題,讓大家幫忙看看

 

 

 

可以看到,這個腳本首先將目標文本文件的名字當作該腳本的第一個參數($1)傳遞進去,然後查看這個文本文件的內容(cat $1),並將內容賦值給 firstLine 變數

 

接著對文本內容的每一行進行遍歷然後正則匹配,並將匹配到的內容綠色高亮輸出出來,不匹配的內容紅色高亮輸出,並顯示提示信息

 

其中,正則匹配表達式^\[(\d+)+\].+$ 匹配一組方括弧 [ ] ,方括弧後還有內容且方括弧之間由數字組成:

  • 第一部分:^\[(\d+)+\]

    • ^\[ 表示以 [ 開頭,\ 為轉義字元

    • (\d+) +表示匹配多個數字,\ 為轉義字元

    • \] 表示匹配右方括弧,\ 為轉義字元

  • 第二部分:.+$

    • .+ 表示匹配任意字元

    • $ 表示結尾

 

因此上面的正則表達式可以匹配:[123] this is a test line 這樣的內容

 

我們來執行一下這個腳本,首先看下目標文件內容

 

 

由腳本的執行結果得知,文本文件中的內容均沒有匹配到

 

奇怪,正則表達式寫的沒有問題,為啥腳本裡面的正則不匹配呢

定位問題

在解決這個問題之前,我們先來瞭解一下正則表達式(Regular Expression)

 

什麼是正則表達式

正則表達式是一種通用的文本匹配工具

 

它允許你使用特定的語法來描述和匹配文本中的模式,可以說是描述文本內容組成規律的表示方式

 

正則表達式的發展史

正則表達式的起源,可以追溯到早期神經系統如何工作的研究

 

在 20 世紀 40 年代,有兩位神經生理學家(Warren McCulloch 和 Walter Pitts),研究出了一種用數學方式來描述神經網路的方法

 

1956 年,一位數學家(Stephen Kleene)發表了一篇標題為《神經網路事件表示法和有窮自動機》的論文。這篇論文描述了一種叫做「正則集合(Regular Sets)」的符號

 

隨後,大名鼎鼎的 Unix 之父 Ken Thompson 於1968年發表了文章《正則表達式搜索演算法》,並且將正則引入了自己開發的編輯器 qed,以及之後的編輯器 ed 中,然後又移植到了大名鼎鼎的文本搜索工具 grep 中

 

自此,正則表達式被廣泛應用到 Unix 系統或類 Unix 系統 (如 macOS、Linux) 的各種工具中,但是百家爭鳴的場面使得各種語言和工具中的正則雖然功能大致類似,但仍然有不少細微差別

 

正則表達式兩種流派之 POSIX 流派

上個世紀八十年代,POSIX (Portable Operating System Interface) 標準公諸於世,它制定了不同的操作系統都需要遵守的一套規則

 

其中就包括正則表達式的規則,遵循 POSIX 標準的正則表達式,稱為 POSIX 派系正則表達式

 

POSIX 規範定義了正則表達式的兩種標準

  • 基本正則表達式 BRE(Basic Regular Expression)

    • 不支持量詞問號和加號,也不支持多選分支結構管道符

  • 擴展正則表達式 ERE(Extended Regular Expression)

    • BRE 在使用花括弧,圓括弧時要轉義才能表示特殊含義。由於BRE 功能不夠強大,導致了 ERE 擴展標準的誕生

 

像 Unix 系統或類 Unix 系統上的大部分工具,如 grep 、sed 、awk 等都屬於 POSIX 派系

 

BRE 標準和 ERE 標準

早期 BRE 與 ERE 標準的區別主要在於,BRE 標準不支持量詞問號和加號,也不支持多選分支結構管道符

 

BRE 標準在使用花括弧,圓括弧時要轉義才能表示特殊含義。BRE 標準用起來這麼不爽,於是有了 ERE 標準,在使用花括弧,圓括弧時不需要轉義了,還支持了問號、加號和多選分支

 

我們現在使用的 Linux 發行版,大多都集成了 GNU 套件。GNU 在實現 POSIX 標準時,做了一定的擴展,主要有以下三點擴展

  1. GNU BRE 支持了 +、?,但轉義了才表示特殊含義,即需要用 \+、\? 表示

  2. GNU BRE 支持管道符多選分支結構,同樣需要轉義,即用 \| 表示

  3. GNU ERE 也支持使用反引用,和 BRE 一樣,使用 \1、\2…\9 表示

 

POSIX 字元組

POSIX 流派還有一個特殊的地方,就是有自己的字元組,叫 POSIX 字元組

 

正則表達式兩種流派之 PCRE 流派

除了 POSIX 標準外,還有一個 Perl 分支,隨著 Perl 語言的發展,Perl 語言中的正則表達式功能越來越強悍,為了把 Perl 語言中正則的功能移植到其他語言中,我們熟知的 PCRE 就誕生了

 

PCRE 是一個相容 Perl 語言正則表達式的解析引擎,是由 Philip Hazel 開發的,為很多現代語言和工具所普遍使用

 

除了 Unix 上的工具遵循 POSIX 標準,PCRE 現已成為其他大部分語言和工具隱然遵循的標準

 

目前大部分常用編程語言都是源於 PCRE 標準,這個流派顯著特征是有 \d\w\s 這類字元組簡記方式

 

在 UNIX/LINUX 系統里 PCRE 流派與 POSIX 流派的對比,可以參考下表

 

在 Linux 中使用正則

在遵循 POSIX 規範的 UNIX/Linux 系統上,按照 BRE 標準 實現的有 grep、sed 和 vi/vim 等

 

而按照 ERE 標準 實現的有 egrep、awk 等

 

但是在 Linux 的 bash 中,原生的正則表達式語法是基於 POSIX 標準的(支持 ERE 標準和 BRE 標準),不直接支持 PCRE 標準

 

在瞭解完正則表達式之後,我們再回到問題本身

 

腳本中的正則表達式出現了 \d ,而 \d 是屬於 PCRE 標準,而 Linux Bash (基於 POSIX 標準)不支持 PCRE 標準,所以匹配不到

 

 

3.解決問題

知道了 Linux Bash 不支持 PCRE 標準,我們將腳本中的正則表達式由 PCRE 標準改成 ERE 標準即可

 

  • 改成 ERE 標準

  • 修改腳本:在腳本裡面使用 grep 進行正則匹配過濾
    • -P 參數表示支持 PCRE 正則

    • -v 參數表示取反操作

 

 看下執行結果

參考鏈接:

  • https://zq99299.github.io/note-book/regular/03/03.html#正則表達式簡史

  • https://askubuntu.com/questions/1143710/regex-with-d-doesn-t-work-in-if-else-statement-with


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本系列文章導航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知識對您有所提示,同時歡迎交流和指正 作者:aierong出處:https://www ...
  • 本系列文章導航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知識對您有所提示,同時歡迎交流和指正 作者:aierong出處:https://www ...
  • 安裝 NuGet 包:在 Visual Studio 中打開項目,右鍵單擊項目名稱,選擇“管理 NuGet 包”,搜索“Quartz”並安裝。 創建作業:創建一個實現了 IJob 介面的類,該介面包含一個 Execute 方法,該方法將在作業運行時調用。例如: public class MyJob ...
  • 朋友做網站需要根據城市展示天氣預報,找了一圈沒有找到靠譜的介面,今天在中央氣象臺的官網查詢某個城市找到了介面,先用postman試了一下居然可以使用,可以查詢某個城市7天的天氣預報等信息。但是查詢編碼是氣象臺自己的編碼,在網上搜索了一下居然有這個編碼。本文使用HttpClient方法查詢這個介面。 ...
  • #總覽需求 1. 簡述靜態網頁和動態網頁的區別。 2. 簡述 Webl.0 和 Web2.0 的區別。 3. 安裝tomcat8,配置服務啟動腳本,部署jpress應用。 1、簡述靜態網頁和動態網頁的區別 靜態網頁: 請求響應信息,發給客戶端進行處理,由瀏覽器進行解析,顯示的頁面,靜態網頁包含文本、 ...
  • title: msp430點燈實驗 date: 2023-04-15 15:31:25 description: 基於msp430f5529點燈實驗 一、實驗內容 使用開發板:msp430f5529 使用的LED燈:為開發板上自帶的User LEDs(LED1、LED2) 環境:CCS (Versi ...
  • 一、 yum mysql5.7以下 mysql5.7以上 Centos8 可以,但是需要重新配置文件 可以,但是需要重新配置文件 可以,但是需要重新配置文件 Centos7 可以直接yum,但是是安裝mariadb-server。如果是mysql-server需要配置文件 直接yum後啟動就好 yu ...
  • 本文章來自我的微信個人技術公眾號 網路技術修煉,公眾號中總結普及網路基礎知識,包括基礎原理、網路方案、開發經驗和問題定位案例等,歡迎關註。 Linux網路開發者面臨的問題往往比較複雜,因此需要使用一些工具和命令來進行定位和解決。在本篇博客中,我將總結一些常用的Linux網路開發者工具和命令,包括網路 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...