=
文字列の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
先読み/後読み構造をサポートしていないため、置換時にキャプチャグループが使用され、後方参照されます。