마지막 "/" 이후의 모든 문자를 삭제하는 정규식

마지막 "/" 이후의 모든 문자를 삭제하는 정규식

다음과 같은 파일에 경로 이름 목록이 있습니다.

/path/to/directory/one.txt
/longer/path/to/some/directory/two.py
/path/with spaces/in/it/three.sh

마지막 "/" 이후의 모든 문자를 제거하고 싶으므로 위에서 원하는 출력은 다음과 같습니다.

/path/to/directory/
/longer/path/to/some/directory/
/path/with spaces/in/it/

답변1

sed 's![^/]*$!!'

이는 다음을 수행합니다.

  • /정규 표현식에는 가 포함되어 있으므로 가 아닌 구분 기호를 사용하십시오 /. (저는 구분선처럼 보이기 때문에 다른 사람들은 , , 또는 원하는 대로 사용합니다  !. 로 구분 된 정규식에서 사용할 수 있지만 사람이 읽기 어려울 수 있습니다.)|@#^//
  • 를 제외한 (0개 이상의) 문자로 구성된 문자열을 찾습니다 /. (최대한 길게.) 단, 줄 끝에 있어야 합니다.
  • 그리고 무엇이든 교체하세요.

참고: 문자가 포함되지 않은 입력 줄은 /완전히 지워집니다(즉, 줄의 전체 내용이 제거되고 빈 줄만 남습니다). 이 문제를 수정하고 슬래시가 없는 줄을 그대로 두려면 명령을 다음과 같이 변경할 수 있습니다.

sed 's!/[^/]*$!/!'

마지막 답변과 일치한다는 점을 제외하면 첫 번째 답변과 동일합니다./ 그리고그 뒤의 모든 문자를 a로 바꿉니다 / (실제로는 /입력 줄의 마지막 문자를 그대로 둡니다). 따라서 첫 번째 답변을 찾아 one.txtnull로 바꾸면 이 답변을 찾아 /one.txtnull로 대체합니다 /. 그러나 문자가 포함되지 않은 줄에서는 /첫 번째 답변이 전체 줄과 일치하여 아무것도 바꾸지 않는 반면, 이 답변은 일치하는 항목을 찾지 못하고 바꾸지 않습니다.

이 명령에 구분 기호를 사용할 수 있지만 /반드시 구분 기호를 사용해야 합니다.

sed 's/\/[^/]*$/\//'

정규식과 대체 문자열 앞에 "이스케이프 처리된" 슬래시를 추가하여뒤쪽에슬래시( \). 어떤 사람들은 이 "기댄 나무" 정글을 읽고 유지하기가 더 어렵다고 생각하지만 이는 기본적으로 스타일의 문제로 귀결됩니다.

답변2

다음 유틸리티를 사용할 수 있습니다 dirname.

xargs -I {} dirname {} <file.txt

그러면 목록에 있는 각 상위 디렉토리의 경로 이름이 제공됩니다. 주어진 목록에 대해 다음을 생성합니다.

/path/to/directory
/longer/path/to/some/directory
/path/with spaces/in/it

경로에 줄 바꿈을 포함하려면 다음을 사용하십시오.

/some/path with a \
newline/in/it

따옴표를 포함하려면 예를 들어 로 이스케이프 처리하세요 \".

관련 정보