다음과 같은 정보가 포함된 파일이 있습니다.
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 버전은 sed
GNU와 호환되지 않습니다. 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
-- 그만두다