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/\.[^.]*$//'
}

関連情報