간단한 테스트 PHP 스크립트가 있다고 가정해 보겠습니다.
<?php
$a = ($argc == 2 ? $argv[1] : 10);
for ($i = 0; $i < $a; $i++) {
echo '.';
}
echo PHP_EOL;
이제 파일에 대해 grep 또는 조건부 sed를 수행합니다.
grep '<' test.php
포함된 두 줄을 생성합니다 <
. 매우 명확한.
grep '\?' test.php
물음표가 포함된 두 줄을 생성합니다. 매우 명확한.
grep '<\?' test.php
모든 행을 반환합니다. 이유는 무엇입니까? 첫 번째 줄만 출력할 것으로 예상했습니다. 하지만 <
이스케이프해야 할 수도 있습니다. 그러면 예상치 못한 또 다른 출력이 생성될 수 있습니다.
sed -n '/pattern/p' test.php
동일한 결과가 생성됩니다.
나는에서 대답을 얻으려고 노력하고 있습니다.https://regex101.com/, 그러나 놀랍게도 웹사이트에는 내가 기대했던 내용이 나와 있었습니다. 또한 grep
내가 기대했던 결과를 생성한 빠르고 더러운 PHP 구현은 다음과 같습니다 .
<?php
if (($fh = fopen($argv[2], 'r')) !== false) {
while ($line = fgets($fh)) {
if (mb_ereg($argv[1], $line) !== false) echo $line;
}
}
grep
내 질문은: 이 일치 항목의 합계가 일치하는 이유는 무엇입니까 sed
?
답변1
grep
의 기본 동작은 정규식을 다음과 같이 해석하는 것입니다.기본 정규식(BRE). 이는 특수 기호로 지원되지 않습니다 ?
. 이는 기본 기능입니다.
grep '<?' test.php
따라서 원하는 결과를 얻을 수 있습니다.
GNU는 grep
확장 정규 표현식에서는 특별한 의미를 가지지만 BRE에서는 그렇지 않은 기호의 이스케이프 버전을 처리합니다.BRE에서도 특수 기호로서 이는 \?
ERE와 BRE에서 동일한 의미를 갖습니다. ?
따라서 grep '<\?'
0 또는 1과 일치하면 <
모든 항목과 일치합니다( <
또는 색상 출력이 활성화된 경우 강조 표시됨).
동일한 추론이 적용됩니다.sed
.