다음과 같은 파일에 경로 이름 목록이 있습니다.
/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.txt
null로 바꾸면 이 답변을 찾아 /one.txt
null로 대체합니다 /
. 그러나 문자가 포함되지 않은 줄에서는 /
첫 번째 답변이 전체 줄과 일치하여 아무것도 바꾸지 않는 반면, 이 답변은 일치하는 항목을 찾지 못하고 바꾸지 않습니다.
이 명령에 구분 기호를 사용할 수 있지만 /
반드시 구분 기호를 사용해야 합니다.
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
따옴표를 포함하려면 예를 들어 로 이스케이프 처리하세요 \"
.