[英]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的新手,我無法理解每個部分的功能。
我將嘗試解釋我所理解的內容,你們可以填補遺漏的內容。 我將逐個字符地走
^void.*{$
- 這意味着以void
開頭並以{
結尾的任何內容 /!b;
我沒有得到這個。 現在b
用於branching
。 什么是/
做那里 :a;
用於制作標簽a
/\\n
再次沒有理解/
那里 }$
與結尾}
/bb
我不明白 $!
表示如果不是文件結尾 {N;
沒有得到它意味着什么,N意味着復制緩沖區中的下一行,但確實得到{
:b
沒有得到它。 b用於分支,但不知道它在那里做什么10. s/\\n/&test1&/
我認為它用\\ntest1\\n
替換\\ntest1\\n
但不確定 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讓你仍然可以匹配所有內容,但保留\\(
和\\)
之間的所有內容,以便在表達式的替換部分中使用。 例如,如果給出輸入字符串abcde
則s/a\\(b\\)c\\(d\\)e/\\1 \\2/
將輸出bd
。 在示例中, \\1
和\\2
分別替換為在轉義的parens, b
和d
中捕獲的內容。
s
- 這是一種替代模式:
/
- 找到
\\(
- 並放入\\1
替換變量
.
- 任何事情
*
- 及其任何數量
\\n
- 包括您遇到的第一個換行符
\\)
- ( \\1
的捕獲結束)
\\(
- 並放入\\2
替換變量
.
- 任何事情
*
- 及其任何數量
\\n
- 包括您遇到的第一個換行符
\\)
- ( \\2
的捕獲結束)
/
- 並將其全部替換掉
\\1
- 捕獲的第一件事,
test2\\n
- test2 \\ n,
\\2
- 和第二件事被捕獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.