awk 数値フィールドのみを削除

awk 数値フィールドのみを削除

このコマンドを使用するとき:

ls /var/log/packages/*SBo|cut -d / -f 5

次を返します。

webcore-fonts-3.0-noarch-3_SBo
winetricks-20120923-noarch-1_SBo
wireshark-1.12.1-x86_64-1_SBo
wxGTK-2.8.12-x86_64-3_SBo

数値フィールドから始めてすべての項目を削除したい(残りの行は省略する必要があります)。だから私は次のように見えたいです。

webcore-fonts
winetricks
wireshark
wxGTK

どうすればいいですか?完璧だと思いますawkが、残りの行(数字のみを削除)を削除する方法がわかりません。

答え1

あなたは試すことができます:

ls /var/log/packages/*SBo| sed 's/-[0-9].*//'

答え2

これは次の方法で簡単に実行できますsed

$ ls /var/log/packages/*SBo | sed -r 's|.*/||; s/-[[:digit:]][[:digit:].]*-.*//'
webcore-fonts
winetricks
wireshark
wxGTK

説明する:

  • -r

    これにより、拡張正規表現がアクティブになり、必要なエスケープ回数が減ります。

  • s|.*/||

    ファイル名の前のディレクトリが削除されます。

  • s/-[[:digit:]][[:digit:].]*-.*//

    これはダッシュで囲まれた数字のように見え、ダッシュとその後のすべての内容が削除されます。[:digit:]代わりに正規表現を使用すると、[0-9]すべてのロケールと拡張文字セットで機能します。

Mac OSXでは、次のことを試してください。

ls /var/log/packages/*SBo | sed -E -e 's|.*/||' -e 's/-[[:digit:]][[:digit:].]*-.*//'

答え3

ファイル名にスペースなどの奇妙な文字が含まれている場合や、コマンドを解析するアイデアが気に入らない場合は、次のようにls使用できますfind

find /var/log/packages -maxdepth 1 -name '*SBo' -exec sh -c 'sed s,.*/,,\;s/-[[:digit:]].*//<<<"$0"' {} \;

答え4

Bourneなどのシェルでこれを行うことができます。

for Package in /var/log/packages/*SBo;do
    Package="$(basename $Package)"
    echo "${Package%%-[0-9]*}"
done

これは以下を利用します。パラメータ拡張-パッケージ名から最初の項目以降のすべての項目、数字、その他の項目をすべて削除します。

そのロケールに不明な[0-9]番号がある場合に[[:digit:]]使用するヒントJohn1024の答えまたここで働きます。それは、

for Package in /var/log/packages/*SBo;do
    Package="$(basename $Package)"
    echo "${Package%%-[[:digit:]]*}"
done

また動作します。

関連情報