Grep은 느낌표가 한 번 나타나는 텍스트 줄을 찾습니다.

Grep은 느낌표가 한 번 나타나는 텍스트 줄을 찾습니다.

다음 내용이 포함된 파일이 있다고 가정해 보겠습니다.

some:text:!someothertext
another:text:!!anothertext

'!'가 한 번만 나타나는 텍스트 줄만 찾고 싶습니다.

이것이 내가 가지고 있는 것이고 작동하는 것 같지만 더 좋은 방법이 있는지 궁금합니다.

grep -E ':![^!]' my_tex.txt

답변1

awk아래의 및 it을 사용하여 gsub()각 줄의 느낌표 수를 계산합니다. 이 명령은 느낌표가 정확히 하나 포함된 행만 출력합니다. &일치하는 느낌표를 자신의 것으로 바꿉니다.

awk 'gsub("!","&") == 1' file

trPerl과 해당 연산자를 사용하여 비슷한 작업을 수행 할 수 있습니다 .

perl -ne 'print if tr /!/!/ == 1' file

grep다음과 같이 하면 영리하게 노력하지 않아도 됩니다 .

grep -F '!' file | grep -v '!.*!'

즉, 단일 느낌표가 포함된 줄을 추출한 후 여러 개의 느낌표가 포함된 줄을 삭제합니다. 여기에는 두 가지 명령을 파이핑하는 것이 포함되지만 파이핑의 목적은 분명하므로 많은 상황에서 유용할 수 있습니다. 특정 하위 문자열을 피하고 싶지만 여전히 이와 같은 것을 허용하려면 grep두 번째 명령을 단순화할 수 있습니다 grep.grep -v -F '!!'!!!hello!

답변2

나는 다음을 사용할 것이다 sed:

sed 's/!/!/2;t1;/!/p;:1 d' file

또는 여러 줄로 이식 가능한 방식으로:

sed '
    s/!/!/2;t1
    /!/p;:1
    d
' file

또는 줄 인쇄를 비활성화하는 것이 더 짧을 수 있습니다.

sed -n 's/!/!/2;t;/!/p' file

GNU sed및 명령을 사용하여 T교체가 실패했는지 확인합니다.

sed '/!/!d;s/!/!/2;T;d' file

!이것들은 모두 같은 방식으로 작동합니다: 줄에서 두 번째 항목을 바꾸십시오 . 교체가 성공하면(테스트를 통해) 행에 최소 2개가 있으므로 t건너뜁니다.!

답변3

awk -F '!' 'NF==2' filename

산출

some:text:!someothertext

답변4

아마도 당신이 원하는 것은전체 줄 일치0개 이상의 non!으로 둘러싸인 !로 구성됩니다. 캐릭터 - 아무거나

grep -x '[^!]*![^!]*' my_tex.txt

또는

grep '^[^!]*![^!]*$' my_tex.txt

관련 정보