Grep : 한 줄당 일치 횟수


26

.tex 파일의 각 줄에서 일치 횟수 (이 경우 {또는 }) 를 얻으려고 합니다.

나는 알고 -o플래그는 경기를 반환하지만 그것도와 결합 된 새로운 라인의 각 경기, 반환 -n플래그. 반복 횟수를 계산하기 위해 이것을 파이프로 연결할 수있는 것은 아무것도 없습니다. -c플래그는 전체 파일에서 일치하는 항목의 수를 반환 - 어쩌면 내가 한 번에 파이프 하나의 라인은 grep을 할 수 있을까?

답변:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

출력은 다음과 같습니다.

3 1
1 2

첫 번째 줄에서 3 번, 두 번째 줄에서 1 번을 의미합니다.

/programming//a/15366097/3378354 에서 가져 왔습니다 .


감사합니다-Google은 SU에서 많은 정규 표현식을 발견했지만 정규 표현식 태그가없는 것 같습니다. 은 sortGREP의 출력 라인 번호를 기준으로 정렬됩니다로 꼭 필요한 것은, 그러나 나는 전에 좋은 방법 같아요 uniq.
Chris H

2
regex정규식이 쉬운 부분이기 때문에 아마도 태그가 지정되지 않았습니다 .
Tom Zych 2016 년

실제로 필요한 sort -n가요? 어쨌든 그것은 라인 번호 순서로 나오지 않습니까?
Tom Zych 2016 년

당신이 옳습니다, sort -n필요하지 않습니다. 감사.
Moebius 2018 년

@ TomZych, 그것은 당신이 옳은 것으로 판명되었지만, 내가 묻지 않았을 수도 있음을 알고있었습니다. grep에서 tag : regex 로의 정신적 점프는 아마도 너무 많았을 것입니다.
Chris H

3

다양한 솔루션을 읽은 후에는 이것이 문제에 대한 가장 쉬운 접근법이라고 생각합니다.

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
내 의견으로는 최고의 솔루션입니다. 파이프 하나를 줄이면 훨씬 더 간단해질 수 있습니다 grep -o "matchingString" <<< $i | wc -l.
Benjamin W.

1
Rahul

1

grep요구 사항을 사용 하고 있습니까? 대안은 다음과 같습니다.

sed 's / [^ {}] // g'your_file | awk '{인쇄 NR, 길이}'

sed이외의 모든 문자 밖으로 스트립 {} (즉, 만 떠나 {}다음 문자) 및 awk(단지입니다 각 라인에서 카운트를 문자 {}문자). 일치하지 않는 줄을 표시하지 않으려면

sed 's / [^ {}] // g'your_file | awk '/./ {인쇄 NR, 길이}'

내 솔루션은 찾고있는 문자열이 단일 문자라고 가정합니다 (필수). Moebius의 답변은 여러 문자 문자열에보다 쉽게 ​​적용 할 수 있습니다. 또한, 우리의 답변 중 어느 것도 관심있는 문자 / 문자열의 인용되거나 이스케이프 된 발생을 배제하지 않습니다. 예를 들어

{ "nullfunc() {}" }

4 개의 중괄호 문자를 포함하는 것으로 간주됩니다.


grep실제로 요구 사항은 아니었고 솔루션을 찾기 시작한 곳이었습니다. 나는 awk가 필요하지 않았으므로 위의 대답을 실험 기회로 사용하지 않았다면 여전히 그렇습니다. 내가 분명히하지 못했지만 (두 대답에 영향을 미치지 않음) 대괄호 당 한 번 스크립트를 실행하여 대부분의 쌍이 발생하는 불일치 (LaTeX 소스, 여기 표)를 추적하는 데 도움이되고 싶었습니다. 한 줄.
Chris H

“괄호 당 한 번 스크립트를 실행하십시오”라는 의미가 무엇인지 잘 모르겠지만 중괄호 불일치를 추적 sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'하려면 sed스트립과 일치하는 쌍이 있는 곳 과 같은 것을 시도해 볼 수 있습니다 . 중첩 쌍이있는 경우을 사용 하여 가장 깊은 중첩만큼 sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …반복합니다 s/{[^{}]*}//g.
Scott

나는`sed 's / [^}] // g'your_file | awk '{print NR, length}'및 's / [^ {] // g'your_file | awk '{print NR, length}'. 나는 실제로 중첩을 가지고 있으며, 가장 깊은 수준의 운동은 집안일처럼 보였다. 많은 줄을 소수로 바꾸는 것 (유효한 이유로 여러 줄에 걸쳐 중괄호 만 일치하는 몇 가지 경우가 있음)이 잘 작동했습니다 (나는 이해하는 모든 유형의 브래킷에 대해 일치하는 괄호를 강조 표시하는 jedit를 사용합니다). 좁힐 필요가 있습니다).
Chris H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.