3

私のbashコマンドラインの正しい正規表現を思い付く方法を理解できないようです。これが私がやっていることです:

echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\(.*\)-[0-9].*/\1/g'

これにより、次の出力が得られます...

XML-Xerces-2.7.0

...しかし、必要なのは出力が...

XML-Xerces

...私はこれを行うことができると思います...

 echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\(.*\)-[0-9].*/\1/g' | sed -e's/^\(.*\)-[0-9].*/\1/g'

sed...しかし、正規表現をもう少しよく理解する方法を知りたいです。

アップデート:

私はこれを試しました...

echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\([^-]*\)-[0-9].*/\1/g'

...提案どおりですが、それは出力しますXML-Xerces-2.7.0-0.tar.gz

4

2 に答える 2

6

sed で貪欲でない正規表現を行うことはできませんが、代わりに次のようなことを行うことができます。

echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e 's/^\(\([^-]\|-[^0-9]\)*\).*/\1/g'

-が続くまですべてをキャプチャします[0-9]

于 2013-09-13T16:49:19.287 に答える
3

bash にいるときは、実際には sed しません。

shopt -s extglob
V='XML-Xerces-2.7.0-0.tar.gz'
echo "${V%%-+([0-9]).+([0-9])*}"
于 2013-09-13T17:00:50.027 に答える