Text-Processing

搜尋和替換問題

  • January 13, 2015

我需要找到所有出現的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///替換語句中完成。它將一個\newline 字元放在所有的頭部和尾部,AAA*BBB*同時出現在模式空間中。定界有時會很棘手——通常放置首端定界符會改變尾端定界符的位置,反之亦然。我盡可能嘗試在單一範圍內採取該步驟,以避免編輯編輯。

所以我們會從裡到外看它,但我們確實認為這sed是從左到右掃描模式空間以查找每次出現的結果模式,因為我將global 標誌附加到s///替換語句的尾部。

  • [AB]-sed當遇到第一個AB任何一系列掃描時,將暫停其掃描。接下來會尋找…

  • \([AB]\)\1\1*- 至少一個緊隨其後的相同字元和任何/所有連續的相同字元,只要序列可以持續。我將[AB]字元類分組在一個\(子表達式中\),因此可以使用 back-reference 來引用它的內容\1

    • 這與做[AB]\{2,\}或什\([AB]\)\{2,\}至在那些情況下sed會考慮兩者AB匹配模式不同。相反,這裡添加到匹配組的所有字元都與[AB].
  • \n&\n- 在替換的右側,s///我引用了剛剛匹配的整個序列,&並在其頭部和尾部插入了一個\newline 字元。

    • 許多seds 不支持\n替換右側的 ewline 反斜杠轉義。如果是這種情況,您可以簡單地使用文字\newline 字元n代替。

以下是範例輸入字元串上l此替換的結果:s///

\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n

您可以看到,除了插入額外的\newline 字元*(這幾乎sed是編輯後只能出現在模式空間中的唯一字元)* sed之外,根本沒有改變字元串 - 沒有修改輸入字元。

您還可以看到每個AAA*BBB*序列現在立即包含在\newlines 中。因此,當我進行下一次global替換時s///,我只需要告訴sed

  • AA\n- 僅在序列的尾部開始每場比賽,AAA*緊隨其後的是……
  • \([[:alnum:]]\{1,\}\)- 一個或多個字母數字字元。這永遠不應該成為一個BBB*序列,因為AAA*緊接在它們之前BBB*的地方現在有兩條中間\newlines 在它們之間。此字母數字序列必須緊跟…
  • \nBB``BBB*-序列的頭端。

而在右手邊…

  • CC\1DD- 我們用它自己和w/替換AA\nw / 。CC \1``\nBB``DD

在這一點上,一個l書揭示了……

\nCCHelloDD\n Text \nCCByeByeDD\n

…明顯的成功!我們現在只需要做…

`s/\n//g`

…並刪除任何剩餘的\newline 分隔符,工作就完成了。

這是我在鍵盤上隨機敲擊幾秒鐘的結果,呈現為輸入。這是一個複雜得多的輸入範例,因此我\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

引用自:https://unix.stackexchange.com/questions/178770