设想
我正在寻找包含未注释掉的“屏幕截图”的行。
想法
- 我最初的想法是使用负前瞻但这不适用于我的 grep 命令
- 我的下一个想法是寻找包含
^[\sa-z0-6\.]+screenshot
which的行,以确保在之前不存在//
或不存在任何实例,但似乎括号也不起作用/*
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