単一文字の解決策はたくさんありますが、部分文字列の解決策はありません。近い解決策がありますが、最後の部分文字列以降のすべてのエントリが削除されます。
$ 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-//'
.*?
貪欲ではないバージョンはどこにありますか.*
?
答え2
以下の2つの方法で行いました。
最初の方法
echo "pkg-new-pkg-20180925-090719.x86_64"| sed "s/pkg-//"
new-pkg-20180925-090719.x86_64
2番目の方法
echo "pkg-new-pkg-20180925-090719.x86_64"| awk -F "-" '{$1="";print $0}'| sed 's/^ //g'| sed "s/ /-/g"
new-pkg-20180925-090719.x86_64