完成的产品

完成的产品

设想

我正在寻找包含未注释掉的“屏幕截图”的行。

想法

  • 我最初的想法是使用负前瞻但这不适用于我的 grep 命令
  • 我的下一个想法是寻找包含^[\sa-z0-6\.]+screenshotwhich的行,以确保在之前不存在//或不存在任何实例,但似乎括号也不起作用/*await page.screenshot
  • 目前仅grep -E '^\s+await page.screenshot' test/*.js在工作

问题

如何确保括号适用于我的正则表达式模式,例如^[\sa-z0-6\.]+screenshot

**编辑**

我使用 grep 作为笑话预提交测试的一部分。这是来自 puppeteer 测试之一的示例代码

    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.screenshot未注释掉的实例,那么我基于 grep 的测试就会失败。一旦我通过屏幕截图弄清楚了,我将编写一个测试,执行相同的操作,但检查源 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实现有一个-P选项,允许您使用类似 Perl 的正则表达式,特别是perl的否定前瞻(?!...)运算符。

因此,通过这些,寻找screenshot出现的情况不是找到后//,你可以这样做:

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

\s标准的基本正则表达式中没有。在括号表达式内,[\s]POSIX 要求匹配\s。在外部,该行为是未指定的,这使得一些grep实现(例如 GNU 的最新版本)grep赋予它与它在perl(相当于标准[[: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"不能工作。

因此,^[\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注释内带有 not 的行,这意味着如果您找到 a /,则您既不需要也不需要/*后面的行。你可以试试这个:

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

输出:

page 2.screenshot

相关内容