쉼표로 구분된 파일이 있습니다. 특정 텍스트를 찾은 다음 전체 줄을 삭제해야 합니다.
예를 들어
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
편집하다:
888
4열만 포함하는 행 삭제
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를 갖습니다. 이렇게 하면 하드 링크가 끊어집니다.