다음과 같은 텍스트 파일을 참고하세요.
/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