sed를 사용하여 파일 이름만 얻는 방법

sed를 사용하여 파일 이름만 얻는 방법

sed를 사용하여 파일 이름만 얻는 방법은 무엇입니까? 나는 이것을 가지고있다

out_file=$(echo $in_file|sed "s/\(.*\.\).*/\1mp4/g")

그러나 나는 또한 길을 얻었고 /root/video.mp4그것이 내가 원하는 전부입니다 video.mp4.

답변1

basenameGNU에서핵심 도구이 작업을 수행하는 데 도움이 될 수 있습니다.

$ basename /root/video.mp4
video.mp4

파일 확장자를 이미 알고 있는 경우 basename다음 구문을 사용하여 호출 basename NAME [SUFFIX]하여 제거 할 수 있습니다.

$ basename /root/video.mp4 .mp4
video

또는 또 다른 옵션은 다음을 사용하여 마지막 지점 이후의 모든 것을 잘라내는 것입니다 sed.

$ basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
video.old

답변2

가장 간단한 해결책은 끝까지 모든 것을 삭제하는 것입니다 /.

echo /root/video.mp4 | sed 's/.*\///'

답변3

다음 방법 중 하나를 사용하십시오.

out_file="${in_file##*/}"

out_file="$(basename $in_file)"

out_file="$(echo $in_file | sed 's=.*/==')"

out_file="$(echo $in_file | awk -F"/" '{ print $NF }')"

\(.*\.\)참고로 명령문이 시작부터 지점( )까지 /root/video.문자열과 일치하고 .mp4원래 문자열과 동일한 문자열을 수동으로 추가하기 때문에 동일한 문자열을 얻습니다 . 을 사용해야 합니다 s=.*\([^/]*\)=\1=.

업데이트: (첫 번째 항목은 이제 수정되었습니다.)

확장자 없이 고유한 파일 이름을 얻으려면 다음을 수행하십시오.

out_file="$(echo $in_file | sed 's=.*/==;s/\.[^.]*$/.new_ext/')"

out_file="$(echo $in_file | sed 's=\([^/]*\)\.[^./]*$=\1.new_ext=')"

out_file="$(echo $in_file | awk -F"/" '{ gsub (/\.[^/.]*$/,".new_ext",$NF);print $NF }'

답변4

POSIXly, 디렉토리 이름과 확장자를 제거하십시오.

rootname() {
  LC_ALL=C awk -- 'BEGIN{
    for (i = 1; i < ARGC; i++) {
      file = ARGV[i]
      if (file == "")
        print ""
      else {
        sub("/*$", "", file) # remove trailing / characters if any
        if (file == "")
          print "/"
        else {
          sub(".*/", "", file) # remove dir part
          if (file ~ /[^.]\./) # has a . other than as the first character
                               # also do not consider . and .. have an extension
            sub(/\.[^.]*$/, "", file)
          print file
        }
      }
    }
  }' "$@"
}

예:

$ rootname ~/.zshrc
.zshrc
$ rootname foo/bar/
bar
$ rootname /
/
$ rootname ""

$ rootname .foo.bar
.foo
$ rootname file.tar.gz
file.tar
$ rootname foo.d/bar
bar
$ rootname $'foo.d/\nbar.x'

bar

csh, tcsh, zsh, bash 또는 vim에는 :t(꼬리) 그리고 :r(뿌리) 수정자를 결합하여 :t:r얻을 수 있습니다.뿌리~의꼬리, 하지만 참고하세요:

  • 에서는 bash히스토리 확장에서만 사용 가능하므로 변수의 내용에 적용해야 하는 경우에는 유용하지 않습니다.
  • rootname코너 케이스 값(예: ) 또는 확장자가 없는 숨겨진 파일(예: )에 대해 위 함수 /와 다른 결과를 ..얻을 수 있습니다.~/.cshrc
  • 를 제외하고 zshwith는 빈 문자열로 file=/foo/bar/확장됩니다 .$file:t:r

를 사용하여 동일한 작업을 수행할 수 있지만 sed를 사용하는 것만큼 명확하지는 않습니다 awk.

rootname() {
   printf '%s\n' "$1" | LC_ALL=C sed '
     :1
     $!{
       N; # load full input into pattern space for filenames with newlines
       b1
     }

     # handle the empty string
     /./!b

     # remove trailing slashes
     s|/*$||

     /./! {
       # handle slash
       s|^|/|
       b
     }

     s|.*/||; # remove dir part
     /[^.]\./ s/\.[^.]*$//'
}

관련 정보