sed を使用した % 分数の解析

sed を使用した % 分数の解析

私のgithub ciタスクのコードカバレッジを解析しようとしていますが、すべてが機能しますが、カバレッジ%の結果を解析することはできません。コードカバレッジのパーセントスコアを解析するのに役立ちます。正規表現は機能しません。

注文する

name: Pytest Coverage
on:
  pull_request:
    branches: [ main, dev ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.10
      uses: actions/setup-python@v2
      with:
        python-version: "3.10"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install flake8 pytest pytest-cov
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Build coverage file
      run: |
        pytest --cache-clear --cov=src tests/ > pytest-coverage.txt
    - name: Comment coverage
      uses: coroo/[email protected]
    - name: Get Coverage %
      run: |
        LAST_LINE=$(tail -4 pytest-coverage.txt)
        LAST_LINE=$(head -n 1 <<< "$LAST_LINE")
        echo "target line is $LAST_LINE"
        COVERAGE=$(sed -n '$s/.*?\([0-9]+\)%.*/\1/p' <<< "$LAST_LINE")
        echo "overall coverage is $COVERAGE"

$LAST_LINEは

TOTAL                                               2401   1538    36%

$COVERAGEは現在空です。予想される出力は次のとおりです。

36%

答え1

使用sed

COVERAGE=$(sed 's/.*[[:space:]]\([0-9]\+%\)/\1/' <<< "$LAST_LINE")

答え2

最後のスペース文字(スペースまたはタブ)まですべて削除します。

$ sed 's/.*[[:blank:]]//' file
36%

awkスペースで区切られた最後のフィールドを印刷するには、次の手順を実行します。

$ awk '{ print $NF }' file
36%

またはコードの一部として(文字列で始まる行が1つしかないと仮定)TOTAL

COVERAGE=$( sed -n 's/^TOTAL.*[[:blank:]]//p' pytest-coverage.txt )

これは、またはをpytest-coverage.txt呼び出すことなく直接パーセントを抽出します。headtail

答え3

空白以外のすべての文字と空白文字を最後まで削除します。

echo "$LAST_LINE" | sed ':a s/^[^ ]* //;ta'

grepオプションを知っている人o(例gnu grep:):

echo $LAST_LINE | grep -o '[0-9]*%'

関連情報