部分文字列が最初に発生した後のすべてを取得します。

部分文字列が最初に発生した後のすべてを取得します。

単一文字の解決策はたくさんありますが、部分文字列の解決策はありません。近い解決策がありますが、最後の部分文字列以降のすべてのエントリが削除されます。

$ echo pkg-new-pkg-20180925-090719.x86_64 | sed -n -e "s/^.*pkg-//p"
20180925-090719.x86_64

私は何ですか?考える例:

$ echo pkg-new-pkg-20180925-090719.x86_64 | ???
new-pkg-20180925-090719.x86_64

これは分割したい部分文字列の場合ですpkg-。どんなアイデアがありますか?

ベストアンサー1

変数から:

var=pkg-new-pkg-20180925-090719.x86_64
printf '%s\n' "${var#*pkg-}"

${var#pattern}パターンに一致する最短の先行部分を削除します(${var##pattern}最長部分の場合)。

テキスト入力ストリームから:

sed 's/pkg-/\
/;s/.*\n//'

これは以下を置き換えます。最初pkg-改行文字(パターンスペースに表示されない文字)が発生し、その改行文字より前のすべての項目が削除されます。一部のsed実装ではこれを作成できますが、sed 's/pkg-/\n/;s/.*\n//'これは移植可能でも標準でもありません。

ast-openを使用するsed(でも動作しますssed -R):

sed -E 's/.*?pkg-//'

そしてperl

perl -pe 's/.*?pkg-//'

.*?貪欲ではないバージョンはどこにありますか.*

おすすめ記事