区切り文字間の削除にsedを使用しますが、最初の区切り文字は保持します。

区切り文字間の削除にsedを使用しますが、最初の区切り文字は保持します。

=文字列の2番目と1番目の間にあるすべてのものを削除する必要があります/が、文字列はその=ままにしておきます。私は多くのことを試してきましたが、最近のものは

sed -i 's/=[^/]*//

答え1

サンプルの入力/出力なしで、テキストの説明のみに基づいて、次のようになりました。

$ echo "foo=bar=baz/quux" | sed 's/\(.*=.*\)=.*\/\(.*\)/\1=\2/'
foo=bar=quux

それはあなたが望むものにどれくらい近いでしょうか?

答え2

先読みアサーションと後読みアサーションについて書き始めたところ、sed がそれらをサポートしていないことがわかりました。これでうまくいくはずです:

sed -i 's!\(=[^=]*=\)[^/]*/!\1!'

  • /正規表現で文字を使用するので、sコマンドの区切り文字を次のように変更します。!
  • \(=[^=]*=\)=は、1つの文字に続いて0個以上の他の文字が続き、さらに別の文字が続くキャプチャグループです。この部分は、削除する部分文字列の前に=2つの文字があることを確認するために必要です。=
  • [^/]*/区切り文字と2番目の区切り文字の間にあるものに一致します
  • \1一致した文字列全体をキャプチャグループに一致したものに置き換えます\(=[^=]*=\)

答え3

解決策の1つは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

上記の例からわかるように、これは2番目から3番目=までのテキストのみを削除することに制限されます。/

  • ^([^=]+=){2}\K行頭から、非テキストの後に続く2シーケンスを検索します。これは、置換文字列の一部ではなく、正の後方参照を意味します。==\K
  • [^=/]+/は、1つ以上の非=/文字で終わる/
    • そのようなテキストが見つかった場合は削除されます

同じ解決策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

先読み/後読み構造をサポートしていないため、置換時にキャプチャグループが使用され、後方参照されます。

関連情報