您可以用;
字符鏈的多個sed的表情在一起。這裏分別看一下每一個。
第一個表達式/^void.*{$/!b
在劃分/
之間有一個匹配表達式。它匹配:
^
- 行
void
的開始 - 隨後的字符 「空缺」
.*
- 其次是任何
{
- 接着是左花
$
- 後面跟着行尾
第一個表達式中的修飾符!b
表示如果匹配器不匹配,則中止sed評估。
:a
表達式是一個標籤。它與goto-like sed特性一起使用,稱爲分支。我們將在下一個表達式中看到如何使用標籤。
表達/\n}$/bb
匹配:
\n
- 換行符
}
- 後跟一個右捲曲
$
- 隨後的線的端部
修飾語bb
意味着如果你找到一個匹配的話,可以在標籤b中選擇「分支」。標籤b在後面的表達式中定義爲:b
。
$!{N;ba}
表達式應該被視爲一個,儘管它的中間有一個;
。在這種情況下,curlies代表了一系列旨在一起執行的命令。
$!
- 如果它不是輸入
{
的結束 - 開始命令的組(在這種情況下,存在其中兩個)
N
- 讀取另一行,默默
ba
- 分支標籤
}
- 結束命令組
接下來是標籤:b
,當我們通過/\n}$/bb
表達式自己匹配單個線條上的單個}
時,我們會打出標籤。
最後有兩種替代模式,這是非常標準的正則表達式。表達前的s
實質上是指s/find_this/replace_it_with_this/
。在s/\n/&test1&/
的情況下,我們有:
\n
- 找到一個換行符
/
- 與
&
代替它 - 這是在第一個表達式(匹配在這種情況下的東西,換行)
test1
- test1的
&
字 - 又一次的東西被匹配
所以基本上s/\n/&test1&/
意味着用\ntest1\n
代替下一個\n
。
最後一個表達式類似,但引入了一些稱爲捕獲的東西。捕獲讓你仍然可以匹配所有內容,但保留\(
和\)
之間的所有內容以用於替換表達式部分。例如,如果給定輸入字符串abcde
,則s/a\(b\)c\(d\)e/\1 \2/
將輸出b d
。在該示例中,\1
和\2
分別被替換爲在轉義對象b
和d
中捕獲的內容。
s
- 這是一個替代模式:
/
- 找到
\(
- 並投入\1
更換可變
.
- 任何
*
- 和它的任何量
\n
- 包括你遇到
\)
第一個換行符 - (對於\1
拍攝結束)
\(
- 並投入\2
更換可變
.
- 任何
*
- 和它的任何數量
\n
- 包括你遇到
\)
第一個換行符 - (捕捉的末尾\2
)
/
- 與
\1
取代這一切 - 第一件事捕獲,
test2\n
- test2 \ n,
\2
- 並捕獲第二件事。
看起來像回答你的問題的人添加了[解釋](http://stackoverflow.com/a/14215634/1938444)。 – mgamba
他在小組中加入了外國語,我甚至都不明白。我想逐字理解字符 – user175386049
sed是一個很好的工具,可以簡單地替換一行代碼,但是對於其他任何你應該使用awk代替的東西。我一直在使用sed 30年,甚至無法猜測你發佈的命令是在做什麼。如果你發現自己使用的不僅僅是「s」和「g」sed命令,你可能使用了錯誤的工具,所以不要浪費你的時間在這些東西上,只需要一個awk解決方案,它會更清晰,更簡單,未來更容易提升。 –