簡體   English   中英

需要幫助理解sed中的這個正則表達式

[英]Need Assistance with understanding this regex in sed

我發布了這個問題 ,有人回答了這個問題

sed '/^void.*{$/!b;:a;/\\n}$/bb;$!{N;ba};:b;s/\\n/&test1&/;s/\\(.*\\n\\)\\(.*\\n\\)/\\1test2\\n\\2/' file

我是sed和regex的新手,我無法理解每個部分的功能。

我將嘗試解釋我所理解的內容,你們可以填補遺漏的內容。 我將逐個字符地走

  1. ^void.*{$ - 這意味着以void開頭並以{結尾的任何內容
  2. /!b; 我沒有得到這個。 現在b用於branching 什么是/做那里
  3. :a; 用於制作標簽a
  4. /\\n再次沒有理解/那里
  5. }$與結尾}
  6. /bb我不明白
  7. $! 表示如果不是文件結尾
  8. {N; 沒有得到它意味着什么,N意味着復制緩沖區中的下一行,但確實得到{
  9. :b沒有得到它。 b用於分支,但不知道它在那里做什么10. s/\\n/&test1&/我認為它用\\ntest1\\n替換\\ntest1\\n但不確定
  10. s/\\(.*\\n\\)\\(.*\\n\\)/\\1test2\\n\\2/不要得到這個

這個詞:

/^void.*{$/!b

表示匹配^void.*{$和斜杠是正則表達式周圍的正則表達式分隔符。 所以你得到/^void.*{$/ 如果在/regex/!匹配表達式后面有感嘆號/regex/! 那么這意味着執行下列命令,如果正則表達式並not匹配。 以下命令是b ,它是分支。 其中沒有標簽名稱,在腳本末尾分支。 因此總的來說,這個表達式試圖匹配^void.*{$ (即,以void開頭並以{結尾的行)並跳過( b )腳本的其余部分以防匹配失敗( ! )。

這東西:

:a;/\n}$/bb;$!{N;ba};

開始一個標簽:a; 並嘗試匹配\\n}$ (一行上的換行符和單行} ),它再次包含在/regex/ 在匹配時,它將( b )分支到標簽b(因此, /regex/bb )。 如果這不是輸入的結尾( $! ),則讀取一行N並跳回標簽a( ba )。 這里的卷對(即{commands} )創建一個塊。 如果是$!這個塊作為一個整體執行$! 是真的,這意味着有更多的投入。 所以$!{N;ba}只是意味着:

If not end of input:
begin
   real line
   jump to label a
end

你可以將多個sed表達式與; 字符。 這里分別看一下每一個。

第一個表達式/^void.*{$/!b / !b在分隔符之間有一個匹配表達式。 它匹配:

^ - 行的開頭

void - 后跟字符“void”

.* - 后跟任何東西

{ - 后面是左卷曲

$ - 接着是行尾

第一個表達式中的修飾符!b表示如果匹配器不匹配,則中止sed評估。

:a表達式是一個標簽。 它與類似goto的sed功能一起使用,稱為分支。 我們將在下一個表達式中看到標簽的使用方式。

表達式/\\n}$/bb匹配:

\\n - 換行符

} - 接着是右卷曲

$ - 接着是行尾

修飾符bb表示如果找到匹配項,則“分支”到標簽b。 標簽b在后面的表達式中定義為:b

$!{N;ba}表達式應該被解讀為一個,即使它有一個; 在中間。 在這種情況下,curlies表示一系列要一起執行的命令。

$! - 如果它不是輸入的結束

{ - 啟動一組命令(在這種情況下,有兩個命令)

N - 默默地讀另一條線

ba - 分支標記a

} - 結束命令組

接下來是標簽:b ,當我們通過/\\n}$/bb表達式單獨匹配單個}時,我們會點擊它。

最后有兩種替代模式,它們是非常標准的正則表達式。 表達式之前的s基本上是指s/find_this/replace_it_with_this/ s/\\n/&test1&/ ,我們有:

\\n - 找到換行符

/ - 並替換為

& - 在第一個表達式中匹配的東西(在這種情況下,換行符)

test1 - 單詞test1

& - 再次匹配的東西

所以基本上s/\\n/&test1&/指更換下一\\n\\ntest1\\n

最后一個表達式類似,但引入了一些稱為捕獲的東西。 Captures讓你仍然可以匹配所有內容,但保留\\(\\)之間的所有內容,以便在表達式的替換部分中使用。 例如,如果給出輸入字符串abcdes/a\\(b\\)c\\(d\\)e/\\1 \\2/將輸出bd 在示例中, \\1\\2分別替換為在轉義的parens, bd中捕獲的內容。

s - 這是一種替代模式:

/ - 找到

\\( - 並放入\\1替換變量

. - 任何事情

* - 及其任何數量

\\n - 包括您遇到的第一個換行符

\\) - ( \\1的捕獲結束)

\\( - 並放入\\2替換變量

. - 任何事情

* - 及其任何數量

\\n - 包括您遇到的第一個換行符

\\) - ( \\2的捕獲結束)

/ - 並將其全部替換掉

\\1 - 捕獲的第一件事,

test2\\n - test2 \\ n,

\\2 - 和第二件事被捕獲。

暫無
暫無

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

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