다음 내용이 포함된 파일이 있다고 가정해 보겠습니다.
some:text:!someothertext
another:text:!!anothertext
'!'가 한 번만 나타나는 텍스트 줄만 찾고 싶습니다.
이것이 내가 가지고 있는 것이고 작동하는 것 같지만 더 좋은 방법이 있는지 궁금합니다.
grep -E ':![^!]' my_tex.txt
답변1
awk
아래의 및 it을 사용하여 gsub()
각 줄의 느낌표 수를 계산합니다. 이 명령은 느낌표가 정확히 하나 포함된 행만 출력합니다. &
일치하는 느낌표를 자신의 것으로 바꿉니다.
awk 'gsub("!","&") == 1' file
tr
Perl과 해당 연산자를 사용하여 비슷한 작업을 수행 할 수 있습니다 .
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