파일 기본 이름을 제거하고 디렉터리 부분을 유지합니다.

파일 기본 이름을 제거하고 디렉터리 부분을 유지합니다.

다음과 같은 문자열이 있습니다.

dir/subdir/othersubdir/file.txt

하지만 다음과 같이 보일 수도 있습니다.

dir/file.txt

또는

dir/subdir/file.txt

$P이제 디렉토리의 전체 경로 가 있는 스크립트를 만들고 있습니다 file.txt.

이제 나는 이것을 사용한다

sed 's/\/.*txt//g'

txt 및 in으로 끝을 바꾸십시오 /. 이와 같은 것이 있으면 잘 작동 dir/file.txt하지만 다른 예에서는 작동하지 않습니다. 내가 원하는 대로 만들려면 어떻게 수정해야 하나요?

이전 하위 디렉토리와 일치시키고 싶지 않습니다 .*txt. 파일 기본 이름을 제거하고 싶습니다.

답변1

사용을 고집하지 않는다면 sed다음 사용을 고려할 수 있습니다 dirname.

S="dir/subdir/othersubdir/file.txt"
P=$(dirname $S)
echo $P
dir/subdir/othersubdir

S="dir/file.txt"
P=$(dirname $S)
echo $P
dir

답변2

이것은 sed명령입니다:

$ P="dir/subdir/othersubdir/file.txt"
$ sed -r 's/^(.*)\/.*\.txt$/\1/' <<< $P
dir/subdir/othersubdir

위 명령에서 우리는 sed캡처 그룹이라고 불리는 변수의 시작 부분부터 모든 것을 캡처하고 주변에 사용된 대괄호 쌍으로 인해 베이커로 참조된 다음 sed 명령의 교체 부분에서 캡처된 그룹만 인쇄합니다. 역참조를 사용합니다..*^P$/*.txt\1(.*)

답변3

zsh더 단순한 삶을 살고 있다면 :h수정자를 사용하세요.

$ var='dir/subdir/othersubdir/file.txt'
$ echo "$var:h"
dir/subdir/othersubdir

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne 'put IO::Spec::Unix.splitpath($_).[1];'    file.txt

#OR(유닉스의 경우)

~$ raku -ne 'put .IO.dirname;'    file.txt

Raku는 Perl 계열의 프로그래밍 언어입니다. 위의 첫 번째 코드 예제는 파일 경로를 가져와 이를 IO개체로 처리합니다. 개체에는 네 가지 주요 클래스(Unix, Windows, Cygwin 및 QNX)가 있습니다. 파일이 Unix 경로로 구성되어 있기 때문에 IO::Spec::Unix경로 구분 기호 등을 올바르게 이해하기 위해 이 메서드가 호출됩니다. 예를 들어 이러한 별도의 함수를 사용하면 Unix 시스템에서 Windows 경로를 조작할 수 있습니다. 그런 다음 경로는 splitpath볼륨, 경로 및 파일 이름의 세 부분으로 나뉩니다(인덱스는 .[1]파일 이름을 제공합니다).

Unix에서는 이 코드가 put .IO.dirname;.

입력 예:

dir/subdir/othersubdir/file.txt
dir/subdir/file.txt
dir/file.txt

예제 출력:

dir/subdir/othersubdir
dir/subdir
dir

https://docs.raku.org/type/IO/Spec/Unix
https://docs.raku.org/routine/dirname
https://raku.org

관련 정보