完成品

完成品

想像する

コメントされていない「スクリーンショット」を含む行を探しています。

アイデア

  • 私の最初の考えは、次を使用することでした。否定的な予測しかし、これは私のgrepコマンドでは動作しません
  • ^[\sa-z0-6\.]+screenshot私の次の考えは、以前//に存在していたか存在していたインスタンスがないことを確認するために含まれている行を見つけることでしたが、括弧も機能しないようです。/*await page.screenshot
  • 現在はgrep -E '^\s+await page.screenshot' test/*.js仕事だけしています。

質問

たとえば、括弧が正規表現パターンに適用されるかどうかを確認します^[\sa-z0-6\.]+screenshot

**編集する**

私は冗談のために提出前のテストの一部としてgrepを使用しています。これは人形劇テストの1つのサンプルコードです。

    test('content group should be closed in 2.12up', async () => {
        // const about = await page.waitForSelector(`${pageObjects.primaryNavLink}:nth-child(2)`);
        // about.click();
        // await page.waitFor(50);

        // await page.waitForSelector(`${pageObjects.secondaryFactory} .api-link`);

        const contentGroup = await page.waitForSelector(pageObjects.contentGroup);
        const boundingBox = await contentGroup.boundingBox();

        // const mc = await page.waitForSelector('.main-container');
        // console.log(mc);

        // await page.screenshot({ path: 'test/screenshots/212post.png' });

        expect(boundingBox['width']).toBeLessThanOrEqual(1);
    });

したがって、grepがコメントアウトされていないインスタンスを見つけた場合、page.screenshotgrepベースのテストは失敗します。スクリーンショットで見つけたら、同じことを行いますが、ソースJavaScriptファイルにコメントされていないインスタンスがあるかどうかをconsole.log確認するテストを作成します。

完成品

興味のある方のために - ジョークテスト

import "core-js/stable";
import "regenerator-runtime/runtime";

const cp = require('child_process');

describe('index.html', () => {
    // test.todo('make sure there are no uncommented console messages')
    test('make sure there are no uncommented console logs', async () => {
        const cmd = `grep -P --exclude=serviceWorker.js '^(?:(?!//).)*console.log' src/*.js`;
        let grep = '';

        try {
            grep = cp.execSync(cmd);
            // console.log(grep.toString())
        } catch (err) {
            // console.log(err)
        }

        expect(grep.toString()).toEqual('');
    });

    test('make sure no screenshots are uncommented', async () => {
        // screenshot refs will cause cicd build to fail
        const cmd = `grep -P '^(?:(?!//).)*page.screenshot' test/*.test.js`;
        let grep = '';

        try {
            grep = cp.execSync(cmd);
            // console.log(grep.toString())
        } catch (err) {
            // console.log(err)
        }

        expect(grep.toString()).toEqual('');
    });
});

答え1

一部のgrep実装には、Perlに似た正規表現、特に否定予測演算子を-P使用するオプションがあります。perl(?!...)

screenshotしたがって、これによって発生する状況を見つけてください。いいえ見つかったら、//次のことができます。

grep -P '^(?:(?!//).)*screenshot'

\s標準の基本正規表現では使用できません。角かっこ式内では、POSIXはまたは[\s]一致が必要です。外部的に動作は指定されていないため、一部の実装(たとえば、最新バージョンのGNU)では、で実行するのと同じ意味を与えます(標準と同じ)。\sgrepgrepperl[[:space:]]

ここで実際を使用して、次のこともできます。

perl -ne 'print if s|//.*||r =~ /screenshot/'

完全性のために、ast-open実装にはオプションがgrepあります。-X改善正規表現。これらの正規表現には!否定演算子があります。したがって、次のようにすることもできます。

grep -X '^(.*//.*)!screenshot'

を使用すると、sedパターンスペースを予約済みスペースにコピーし、コメントを削除してコメントがあるかどうかを確認することもできますscreenshot

sed 'h;s|//.*||;/screenshot/!d;g'

そしてawk

awk -F // 'index($1, "screenshot")'

index()部分文字列チェックの場合$1 ~ /screenshot/(拡張)正規表現の一致に使用されます。)

フィールド区切り記号をに設定します//$1は前の部分です//

答え2

\sかっこ内では動作しません。たとえば、動作しますが
echo " screenshot" | grep -E "^\sscreenshot"動作
echo " screenshot" | grep -E "^[\s]screenshot"しません。

したがって、orの代わりに^[\sa-z0-6\.]+screenshot使用できます。
echo "await page.screenshot" | grep -E "^([a-z0-6.]|\s)+screenshot"
echo "await page.screenshot" | grep -E "^[a-z0-6.[:space:]]+screenshot"

完全なコマンドの場合、screenshotコメント内にない行が表示されると予想します。つまり、 を探すと、その後にある行が/欲しくも望ましくないという意味です。次のことを試すことができます。/*

echo "//page 1.screenshot
page 2.screenshot
foo; //page 3.screenshot" | grep -E "^([^/]|/[^/*])*/?screenshot"

出力:

page 2.screenshot

関連情報