簡體   English   中英

Sed正則表達式和子串否定

[英]Sed regex and substring negation

查找與特定模式匹配的子字符串(前面跟着特定字符串的字符串)的正確語法是什么?

例如,我想取所有以BEGIN_ 開頭的子串,以_END 結尾BEGIN_的子串等於FOO ; 並用格式“( inner substring )”替換整個子字符串 以下內容將匹配:

  • BEGIN_bar_END - > (bar)
  • BEGIN_buz_END - > (buz)
  • BEGIN_ihfd8f398IHFf9f39_END - > (ihfd8f398IHFf9f39)

但是BEGIN_FOO_END不匹配。

我玩過以下內容,但似乎無法找到正確的語法:

sed -e 's/BEGIN_(^FOO)_END/($1)/g'
sed -e 's/BEGIN_([^FOO])_END/($1)/g'
sed -e 's/BEGIN_(?!FOO)_END/($1)/g'
sed -e 's/BEGIN_(!FOO)_END/($1)/g'
sed -e 's/BEGIN_(FOO)!_END/($1)/g'
sed -e 's/BEGIN_!(FOO)_END/($1)/g'

sed ,IIRC中沒有一般否定運算符,因為對DFA的否定的正則表達式的編譯需要指數時間。 你可以解決這個問題

'/BEGIN_FOO_END/b; s/BEGIN_\(.*\)_END/(\1)/g'

where /BEGIN_FOO_END/b表示:如果我們找到BEGIN_FOO_END ,則跳轉 (跳轉)到sed腳本的末尾。

這個話題可能很舊,但為了完整起見,否定運算符!

讓所有不快樂成為非常快樂:

echo -e 'happy\nhappy\nunhappy\nhappy' | sed '/^happy/! s/.*/VERY HAPPY/'

在這里找到: 如何全局替換不以特定模式開頭的行中的字符串

這可能對你有用:

sed 'h;s/BEGIN_\(.*\)_END/(\1)/;/^(FOO)$/g' file

這僅在每行只有一個字符串時有效。

對於每行多個字符串:

sed 's/BEGIN_\([^F][^_]*\|F[^O][^_]*\|FO[^O][^_]*\|FOO[^_]\+\)_END/\(\1\)/g' file

或者更容易理解:

sed 's/\(BEGIN_\)FOO\(_END\)/\1\n\2/g;s/BEGIN_\([^\n_]*\)_END/(\1\)/g;s/\n/FOO/g' file

我不知道一個漂亮的方式,但你總能做到這一點:

$ cat file
BEGIN_FOO_END
BEGIN_FrOO_END
BEGIN_rFOO_END
$ sed '/BEGIN_FOO_END/ !{s/BEGIN_\([^_]*\)_END/(\1)/}' file 
BEGIN_FOO_END
(FrOO)
(rFOO)

暫無
暫無

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

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