다음과 같은 문자열이 있습니다.
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