범위 내의 숫자가 포함된 문자열을 필터링하고 형식을 변경합니다.

범위 내의 숫자가 포함된 문자열을 필터링하고 형식을 변경합니다.

다음 패턴 라인이 포함된 파일이 있습니다.

136x2340+1564+0

그건, <N1>x<N2>+<N3>+<N4>.

에서 까지의 grep모든 행을 필터링하고 싶습니다(아마도 사용 ).N1ab 그리고 N2범위는 c~ 입니다 d.

상수는 a,b,c,d내 문제에 따라 다릅니다. 스크립트에서 수정하겠습니다.

시도했지만 egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]+)'출력이 표시됩니다.

136x2340+1564+0
835x428+355+1780
817x406+186+747
114x1533+1256+456

N2즉, 4자리의 행도 표시됩니다 (3자리만 있는 것 같습니다).

편집하다:또한 (쉼표)로, 첫 번째 기호를 (공백)으로 , 두 번째 기호를 (쉼표) x로 바꾸고 싶으 므로 출력은 다음과 같아야 합니다.,++,

N1,N2 N3,N4

답변1

grep ERE(확장 정규 표현식) 구문에서 +"하나 이상의 선행 원자"를 의미하는 수량자입니다. 이 컨텍스트에서 리터럴 일치를 수행 하려면 +이를 이스케이프해야 합니다.

egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]\+)' file
835x428+355+1780
817x406+186+747

당신이하고 싶다면바꾸다, grep실제로는 올바른 도구가 아닙니다. 하지만 버전에 sed유사한 확장 정규식 패턴이 있는 경우 다음과 같이 사용할 수 있습니다.

sed -En 's/([0-9]{3})x([0-9]{3})\+([0-9]{1,})\+([0-9]{1,})/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

기본 정규식만 있는 경우 이스케이프를 읽기가 더 어려워집니다.

sed -n 's/\([0-9]\{3\}\)x\([0-9]\{3\}\)+\([0-9]\{1,\}\)+\([0-9]\{1,\}\)/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

관련 정보