sed 刪除分隔符之間但保留第一個分隔符

sed 刪除分隔符之間但保留第一個分隔符

我需要刪除=字串中的第二個和第一個/字串之間的所有內容,但保留=原位。我嘗試過很多很多事情,最近的一個是

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

它不支援前向/後向構造,因此在替換時使用捕獲組並反向引用

相關內容