[英]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.