특정 문자열이 포함된 파일에서 줄을 제거하는 방법은 무엇입니까? [복사]

특정 문자열이 포함된 파일에서 줄을 제거하는 방법은 무엇입니까? [복사]

쉼표로 구분된 파일이 있습니다. 특정 텍스트를 찾은 다음 전체 줄을 삭제해야 합니다.

예를 들어

123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883

888이 포함된 행을 삭제해야 합니다.

답변1

사용 sed,

sed '/888/d' filename

-i옵션을 사용하여 다음과 같은 파일을 편집 할 수 있습니다 .

sed -i.bak '/888/d' filename

노트: .bak원본 파일의 백업이 유지됩니다.


특정 열을 포함하는 행을 삭제하고 888다음을 사용해야 한다고 가정합니다.

awk -F"," '$4 != "888"' filename

답변2

사용grep

grep -vw '888' infile.csv > outfile.csv

그 자리에서 편집하고 싶다면,

sed -i.bak '/\b888\b/d' infile.csv

편집하다:

8884열만 포함하는 행 삭제

sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv

답변3

IMO에서는 printf파이프 명령을 사용하는 ed것이 sed -i.

printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt

첫 번째 인수는 남은 각 인수를 개행 문자( )로 구분하여 printf인쇄하도록 지시합니다 .\n

마지막 두 주장 중 어느 것도 실제로 인용이 필요하지 않습니다. 나는 단지 그것들을 예로 인용하고 있습니다. 일부 ed명령에는 인용이 필요합니다.


ed더 나은가요 sed -i?

ed와 달리 sed -i실제 내부 편집을 수행하지 않습니다. 임시 출력 파일을 생성한 다음 이름을 원본 파일로 바꿉니다. 여기에는 두 가지 잠재적인 부작용이 있습니다.

  • umask임시 파일을 생성한 이유에 따라 파일의 권한이 변경될 수 있습니다. 다른 사용자(물론 파일 및 디렉터리에 대한 적절한 RW 액세스 권한이 있는 사용자)가 스크립트를 실행하는 경우 sed -i소유권이나 그룹도 변경될 수 있습니다 .

  • 대체 파일은 다른 inode를 갖습니다. 이렇게 하면 하드 링크가 끊어집니다.

관련 정보