我需要刪除=
字串中的第二個和第一個/
字串之間的所有內容,但保留=
原位。我嘗試過很多很多事情,最近的一個是
sed -i 's/=[^/]*//
答案1
僅基於文字描述,沒有範例輸入/輸出,我想出了這個:
$ echo "foo=bar=baz/quux" | sed 's/\(.*=.*\)=.*\/\(.*\)/\1=\2/'
foo=bar=quux
這離你想要的有多近?
答案2
開始撰寫有關前瞻和後瞻斷言的文章,結果發現 sed 不支持它們!這應該可以解決問題:
sed -i 's!\(=[^=]*=\)[^/]*/!\1!'
- 由於我們在正規表示式中使用
/
字符,因此我們將命令分隔符更改s
為!
\(=[^=]*=\)
是一個捕獲組,匹配一個=
字符,後面跟著零個或多個其他字符,後面跟著另一個=
字符。需要這部分來確保要=
刪除的子字串之前有兩個字符,正如您所說的那樣[^/]*/
匹配分隔符號和第二個分隔符號之間的任何內容\1
用與捕獲組匹配的任何內容替換整個匹配的字串\(=[^=]*=\)
答案3
這是一種解決方案perl
$ echo 'foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
foo=bar=quux
$ echo 'abc=foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
abc=foo=bar=baz/quux
從上面的範例可以看出,這限制了僅刪除從 2nd=
到2nd 的文本/
^([^=]+=){2}\K
從行首開始尋找2
非文字序列,=
後面接著=
。意味著\K
正向後看,不是替換字串的一部分[^=/]+/
表示一個或多個=/
以以下字符結尾的非字符/
- 如果發現這樣的文本,它將被刪除
與相同的解決方案sed
$ echo 'foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
foo=bar=quux
$ echo 'abc=foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
abc=foo=bar=baz/quux
它不支援前向/後向構造,因此在替換時使用捕獲組並反向引用