파일에서 특정 문자열이 포함된 줄을 삭제하는 방법

파일에서 특정 문자열이 포함된 줄을 삭제하는 방법

다음과 같은 텍스트 파일을 참고하세요.

/home/user1/dir1
/home/user1/dir2
/home/user1/
/home/user1/dir1/dir11

목표는 "/home/user1/"만 있고 다른 것은 없는 행을 제거하는 것이므로 최종 결과는 다음과 같습니다.

/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

아래 코드를 사용해 보았지만 /home/user1/이 포함된 모든 줄이 제거되었습니다. 무엇을 해야할지 아시나요?

grep -v "/home/user1/" /home/user1/input.txt > tmpfile && mv tmpfile /home/user1/output.txt

답변1

앵커 포인트를 사용하여 선의 시작과 끝을 표시합니다( ^시작과 $끝). 그러면 상황은 다음과 같이 될 것입니다:

$ grep -v '^/home/user1/$' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

또는 다음 -x옵션을 사용할 수 있습니다.

-x, --line-regexp         match only whole lines

그 다음에

$ grep -vx '/home/user1/' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

귀하의 grep명령은 예상된 작업을 수행하고 있습니다. 일치하는 모든 줄을 찾으십시오.포함하다 /home/user1/, 정확히 일치하지 않습니다.

답변2

sed옵션 이라면

$ sed -n '\|\(/\([^/]*/\)\{2\}\)\<|p' input_file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

답변3

이것이 파일의 정확한 내용이라면 GNU를 사용하는 간단한 해결책은 다음과 같습니다 sed.

sed '/^\/home\/user1\/$/d' file

^줄의 시작 부분을 표시하고 $줄의 끝을 표시하므로 정확한 문자열만 일치합니다. 문자열의 인스턴스를 \이스케이프하는 데 사용됩니다 ./

문자열 줄에 후행 공백이 포함되어 있으면 다음 방법을 사용할 수 있습니다.

sed '/^\/home\/user1\/[[:space:]]*$/d' file

산출:

/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

요구 사항을 충족한다고 확신하면 -i파일을 추가하여 해당 위치에서 편집하세요.

sed -i '/^\/home\/user1\/$/d' file

sed -i '/^\/home\/user1\/[[:space:]]*$/d' file

관련 정보