상상하다
주석 처리되지 않은 "스크린샷"이 포함된 줄을 찾고 있습니다.
아이디어
- 내 초기 생각은 다음을 사용하는 것이 었습니다.부정적인 예측하지만 이것은 내 grep 명령으로는 작동하지 않습니다
^[\sa-z0-6\.]+screenshot
내 다음 생각은 이전//
에 존재했거나 존재했던 인스턴스가 없는지 확인하기 위해 포함된 줄을 찾는 것이었지만 괄호도 작동하지 않는 것 같습니다./*
await page.screenshot
- 현재는
grep -E '^\s+await page.screenshot' test/*.js
일만 하고 있어요
질문
예를 들어 괄호가 정규식 패턴에 적용되는지 어떻게 확인합니까 ^[\sa-z0-6\.]+screenshot
?
**편집하다**
농담에 대한 제출 전 테스트의 일부로 grep을 사용하고 있습니다. 이것은 인형극 테스트 중 하나의 샘플 코드입니다.
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
구현에는 Perl과 유사한 정규식, 특히 부정 예측 연산자 -P
를 사용할 수 있는 옵션이 있습니다 .perl
(?!...)
screenshot
따라서 이를 통해 발생하는 상황을 찾아보세요.아니요일단 발견되면 //
다음을 수행할 수 있습니다.
grep -P '^(?:(?!//).)*screenshot'
\s
표준 기본 정규식에서는 사용할 수 없습니다. 대괄호 표현식 내에서 POSIX는 또는 [\s]
일치가 필요합니다 . 외부적으로 동작은 지정되지 않으므로 일부 구현(예: 최신 버전의 GNU) 에서는 에서 수행하는 것과 유사한 의미를 부여합니다 (표준 와 동일 ).\
s
grep
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"
작동하지 않습니다.
따라서 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