搜尋和替換問題
我需要找到所有出現的
AAsomeArbitraryStringBB
並將其替換為CCsomeArbitraryStringDD
.所以
AAHelloBB Text AAByeByeBB
變成
CCHelloDD Text CCByeByeDD.
請務必注意,替換字元串包含搜尋字元串的一部分。
這是
sed
命令的基本任務:sed 's/AA\(someArbitraryString\)BB/CC\1DD/g'
最終,如果您想對所有“任意字元串”執行此操作:
sed 's/AA\(.*\)BB/CC\1DD/g'
sed "s/\([AB]\)\1\1*/\n&\n/g s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g s/\n//g " <<\INPUT AAHelloBB Text AAByeByeBB INPUT
我認為只有在
AA>>CC&&BB>>DD
有 1 個或多個字母數字字元時才應該進行替換$$ s $$在兩組之間,並且應該總是盡可能地擠壓可能發生的事件。 該範例列印:
CCHelloDD Text CCByeByeDD
最困難的部分是在第一個
s///
替換語句中完成。它將一個\n
ewline 字元放在所有的頭部和尾部,AAA*
並BBB*
同時出現在模式空間中。定界有時會很棘手——通常放置首端定界符會改變尾端定界符的位置,反之亦然。我盡可能嘗試在單一範圍內採取該步驟,以避免編輯編輯。所以我們會從裡到外看它,但我們確實認為這
sed
是從左到右掃描模式空間以查找每次出現的結果模式,因為我將g
lobal 標誌附加到s///
替換語句的尾部。
[AB]
-sed
當遇到第一個A
或B
任何一系列掃描時,將暫停其掃描。接下來會尋找…
\([AB]\)\1\1*
- 至少一個緊隨其後的相同字元和任何/所有連續的相同字元,只要序列可以持續。我將[AB]
字元類分組在一個\(
子表達式中\)
,因此可以使用 back-reference 來引用它的內容\1
。
- 這與做
[AB]\{2,\}
或什\([AB]\)\{2,\}
至在那些情況下sed
會考慮兩者A
並B
匹配模式不同。相反,這裡添加到匹配組的所有字元都與[AB]
.
\n&\n
- 在替換的右側,s///
我引用了剛剛匹配的整個序列,&
並在其頭部和尾部插入了一個\n
ewline 字元。
- 許多
sed
s 不支持\n
替換右側的 ewline 反斜杠轉義。如果是這種情況,您可以簡單地使用文字\n
ewline 字元n
代替。以下是範例輸入字元串上
l
此替換的結果:s///
\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n
您可以看到,除了插入額外的
\n
ewline 字元*(這幾乎sed
是編輯後只能出現在模式空間中的唯一字元)*sed
之外,根本沒有改變字元串 - 沒有修改輸入字元。您還可以看到每個
AAA*
或BBB*
序列現在立即包含在\n
ewlines 中。因此,當我進行下一次g
lobal替換時s///
,我只需要告訴sed
…
AA\n
- 僅在序列的尾部開始每場比賽,AAA*
緊隨其後的是……\([[:alnum:]]\{1,\}\)
- 一個或多個字母數字字元。這永遠不應該成為一個BBB*
序列,因為AAA*
緊接在它們之前BBB*
的地方現在有兩條中間\n
ewlines 在它們之間。此字母數字序列必須緊跟…\nBB``BBB*
-序列的頭端。而在右手邊…
CC\1DD
- 我們用它自己和w/替換AA\n
w / 。CC
\1``\nBB``DD
在這一點上,一個
l
書揭示了……\nCCHelloDD\n Text \nCCByeByeDD\n
…明顯的成功!我們現在只需要做…
`s/\n//g`
…並刪除任何剩餘的
\n
ewline 分隔符,工作就完成了。這是我在鍵盤上隨機敲擊幾秒鐘的結果,呈現為輸入。這是一個複雜得多的輸入範例,因此我
\n
在此處文件中使用轉義的 ewlines 將其拆分。在將單行結果sed
作為輸入傳遞之前,shell 將刪除您可以在此處看到的所有換行符:sed ... <<IN AA kj \ BB\ AAAAAABAkl\ AAAAasjd\ AAAAfo\ BB\ AAia\ BBsdfjomAl\ BBks\ BBmdlmdsviom\ BB\ AAiodsvgmnoi IN
…以及
l
第一次替換後的s///
ook:\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAAAA\nfo\nBB\n\nAA\nia\nBB\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi
…並在第二個之後…
\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAACCfoDD\n\nCCiaDD\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi
…以及最終產品…
AA kj BBAAAAAABAklAAAAasjdAACCfoDDCCiaDDsdfjomAlBBksBBmdlmdsviomBBAAiodsvgmnoi