簡體   English   中英

了解 sed 正則表達式模式

[英]Understanding sed regex pattern

我對 Linux 世界很陌生,我正在嘗試掌握基本命令。 在瀏覽其中一個腳本時,觀察到以下行,我無法理解。

sed -n -e 's|declare -x ||p' -e 's|^declare -ax* \([^=]*\)='\''\(.*\)'\''.*$|\1=\2|p'

通過 SED 並聲明手冊頁,我對標志/選項有所了解,例如 -n 和 -e,但不確定上面給出的類似正則表達式的模式以及命令末尾的“p”到底是做什么的?

試圖在 regex101 網站上重現上述行,但沒有運氣:(

第一個表達式只是刪除了任何declare -x

第二個從declare -ax variable=value中提取變量和值,並在引用方面有一些復雜性。 x是可選的(嚴格來說,正則表達式允許零個或多個,但您可能不會期望超過一個)。

再詳細一點,

  • s|regex|replacement| 只是用replacement替換任何匹配的regex ,使用| 作為正則表達式分隔符而不是默認/
  • 帶有p標志s|regex|replacement|p如果發生替換,則打印結果行; 這通常與sed -n結合使用,僅打印發生替換的行。
  • 'whatever'\''something'\''more stuff'使用 shell 引用來表示單引號字符串中的文字單引號。 您不能在單引號內轉義單引號,因此這使用一個右單引號,后跟一個反斜杠文字單引號,然后是另一個左單引號,以在引用的字符串中嵌入單引號。
  • s/\(something.*\)other/\1/something or other替換為something or ,其中反斜杠括號指定分組, \1是對匹配第一個括號組的文本的反向引用。 類似地, \2指的是第二個帶括號的組,等等。

如果意圖是捕獲單引號字符串,括號內的.*實際上是錯誤的; 正則表達式應該只匹配一個不是單引號的字符(或者理想情況下,根據上面的解釋,一個包含文字單引號的表達式)。

https://regex101.com/不是特別適合sed正則表達式。 它不支持sed的正則表達式方言(最接近的可能是 ECMAScript 方言,但無論如何您必須了解差異),並且無法告訴您周圍的腳本做什么。

ps命令的標志。 在我的系統上,它沒有記錄在man頁中,而是在info頁中。

'p'
如果進行了替換,則打印新的模式空間。

'\''舞蹈只是如何在 bash 參數中插入單引號的常用方法。 在“引號刪除”期間會刪除單引號,並且不能嵌套單引號。 所以你需要結束帶引號的字符串,轉義一個引號,然后開始另一個帶引號的字符串。 您還可以在野外找到替代'"'"'

因此,sed 會將其視為參數(我使用傳統的/而不是|因為沒有必要使用| ):

s/^declare -ax* \([^=]*\)='\(.*\)'.*$/\1=\2/p

在行首搜索declare ( ^ ) 后跟一個空格, -a可能還有xxxxxx等; 后跟一個空格和除=之外的任何內容,然后是= ,然后是單引號中的任何內容。 我們不在乎最后一個單引號后面的內容。 這兩個東西在\1\2中被記住,整行被\1=\2替換,即從其中刪除了declare -axxx ,最外面的單引號也是如此。 如果該行與正則表達式不匹配,則不打印任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM