대소문자를 구분하지 않는 일치 항목이 포함된 줄을 제거하세요.

대소문자를 구분하지 않는 일치 항목이 포함된 줄을 제거하세요.

다음과 같은 정보가 포함된 파일이 있습니다.

20    BaDDOg
31    baddog
42    badCAT
43    goodDoG
44    GOODcAT

단어가 포함된 모든 줄을 삭제하고 싶습니다 dog. 이것이 내가 원하는 결과입니다:

42    badCAT
44    GOODcAT

그러나 dog대소문자를 구분하지 않습니다.

sed 명령을 사용할 수 있다고 생각했지만 sed -e "/dog/id" file.txt제대로 작동하지 않는 것 같습니다. 이것이 제가 OSX에서 작업하는 것과 관련이 있나요? 사용할 수 있는 다른 방법이 있나요?

답변1

노력하다 grep:

grep -iv dog inputfile

-i대소문자 및 -v역방향 일치를 무시합니다.

사용하고 싶다면 sed다음과 같이 할 수 있습니다.

sed '/[dD][oO][gG]/d' inputfile

GNU sed확장패턴 매칭수정자를 사용하면 I일치 항목이 대소문자를 구분하지 않게 되지만 모든 스타일에서 작동하지는 않습니다 sed.

sed '/dog/Id' inputfile

하지만 OS X에서는 작동하지 않습니다.

답변2

OSX 버전은 sedGNU와 호환되지 않습니다. i매뉴얼 페이지에서 볼 수 있듯이 플래그가 완전히 누락되었습니다.

The value of flags in the substitute function is zero or more of the following:
   N       Make the substitution only for the N'th occurrence of the regular expression in
           the pattern space.
   g       Make the substitution for all non-overlapping matches of the regular expression,
           not just the first one.
   p       Write the pattern space to standard output if a replacement was made.  If the
           replacement string is identical to that which it replaces, it is still considered
           to have been a replacement.
   w file  Append the pattern space to file if a replacement was made.  If the replacement
           string is identical to that which it replaces, it is still considered to have
           been a replacement.

gsed다음을 사용하여 설치할 수 있습니다 .양조명령 사용

brew install gnu-sed

그런 다음 다음과 같이 대소문자를 구분하지 않는 플래그와 함께 sed를 사용할 수 있습니다.

gsed '/dog/Id' inputfile

답변3

OSX가 편집된 것 같기 때문에https://ss64.com/osx/, "dog"과 일치하는 행을 삭제하도록 요청할 수 있습니다. 안타깝게도 대소문자 구분은 직접 수행해야 합니다.

ed -s file.txt <<< $'1,$g/[dD][oO][gG]/d\nw\nq'

명령은 여기 문자열에 제공되며 다음 순서로 구분됩니다.

  • 주소 범위 내 1,$(전체 파일)
  • g--다음 정규식과 일치하는 행에 전역적으로 후속 명령을 적용합니다.
  • /[dD][oO][gG]/-- "dog"과 일치하며 대소문자를 구분하지 않습니다.
  • d--적용된 명령은 "삭제"입니다.
  • w-- 업데이트된 파일을 디스크에 쓰기
  • q-- 그만두다

관련 정보