給定一個字符串文件路徑,如「/foo/fizzbuzz.bar」,如何使用bash來提取所述字符串的「fizzbuzz」部分?如何從Bash中的路徑字符串中刪除文件後綴和路徑部分?
回答
下面是如何在猛砸#和%運營商做到這一點。
$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz
${x%.bar}
也可能是${x%.*}
點或${x%%.*}
後刪除所有第一點後刪除所有內容。
實施例:
$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz
文檔可以在Bash manual找到。查找${parameter%word}
和${parameter%%word}
尾部匹配部分。
看看基本名稱命令:
NAME=`basename /foo/fizzbuzz.bar .bar`
純bash的方式:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom";
~$ y=${x/\/*\//};
~$ echo ${y/.*/};
fizzbuzz
此功能在 「參數擴展」 的人bash的解釋。非bash方式比比皆是:awk,perl,sed等。
編輯:用點工作文件後綴並不需要知道的後綴(擴展名),但不工作,在名本身點。
perl -pe 's/\..*$//;s{^.*/}{}'
基名和目錄名的功能是你追求的:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename $mystring)
echo basename + remove .bar: $(basename $mystring .bar)
echo dirname: $(dirname $mystring)
具有輸出:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
使用basename
假定您知道文件擴展名是什麼,不是嗎?
我相信各種正則表達式建議不能處理包含多個「。」的文件名。
以下似乎應付雙點。哦,文件名包含一個「/」本身(只是踢)
套用帕斯卡爾:「對不起,這個腳本是那麼長。我沒有時間把它縮短」
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
如果您不能像其他帖子中建議的那樣使用basename,則可以始終使用sed。這是一個醜陋的例子。這不是最大的,但它通過提取想要的字符串並用想要的字符串替換輸入來工作。
echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'
這將讓你的輸出
fizzbuzz
基名這樣做,刪除路徑。它還會刪除後綴,如果它與文件的後綴相匹配,但您需要知道賦予該命令的後綴。否則,您可以使用mv並找出新名稱應該以其他方式。
小心建議的perl解決方案:它會在第一個點後刪除任何東西。
$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some
如果你想用Perl去做,這樣工作的:
$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with
但如果你使用bash,用y=${x%.*}
(或basename "$x" .ext
如果您知道分機)的解決方案要簡單得多。
使用基本名我用下面來實現這一點:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Do things with $fname
done;
這就要求沒有先驗的文件擴展名的知識,當你有一個具有點中有一個文件名的它的作品甚至是文件名(在前面延期);它確實需要程序basename
,但這是GNU coreutils的一部分,所以它應該隨任何發行版一起提供。
純bash中,兩個獨立的操作來完成:
從路徑字符串刪除路徑:
path=/foo/bar/bim/baz/file.gif file=${path##*/} #$file is now 'file.gif'
刪除從路徑字符串的擴展:
base=${file%.*} #${base} is now 'file'.
將t與第二收視率最高的答案OP級答案得到的文件名不完整的路徑:
$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz
信息,你可以在Bash manual發現,在尾部匹配部分尋找${parameter%word}
和${parameter%%word}
。
- 1. Qt5刪除文件路徑的後綴
- 2. 刪除文件:從URL文件路徑///前綴:///前綴從URL路徑
- 3. 刪除文件路徑的一部分
- 4. 將路徑字符串拆分爲驅動器,路徑和文件名部分
- 5. XSL - 從路徑字符串中刪除文件名
- 6. 結合路徑,文件字符串和文字的路徑
- 7. 如何從包含完整文件路徑的字符串在perl中分離文件名和文件路徑
- 8. 從文件路徑字符串中提取日期部分
- 9. 如何從絕對路徑中刪除或編輯部分字符串
- 10. Unix刪除部分路徑
- 11. 刪除路徑前綴
- 12. 如何找到文件路徑字符串的一部分?
- 13. 從路徑中刪除文件名
- 14. 從絕對路徑中刪除文件
- 15. 從文件名中刪除路徑
- 16. glob.iglob從文件名中刪除路徑
- 17. Powershell;從每個路徑中刪除字符串中的最後一個'/'字符
- 18. 如何從路徑中刪除最短的子路徑?
- 19. 如何從默認的gcc搜索路徑中刪除路徑
- 20. 刪除NSString路徑字符串
- 21. 刪除部分絕對路徑字符串
- 22. 刪除文本文件中每行的當前路徑部分
- 23. delphi刪除。和..從路徑
- 24. Bash - 檢查文件路徑中的字符串
- 25. Java文件從字符串文件路徑中刪除正斜槓
- 26. 獲取部分字符串路徑
- 27. 合併字符串(路徑),而部分
- 28. 如何從C#中的文件路徑獲取子字符串?
- 29. 如何從Get-Location輸出中刪除部分路徑?
- 30. 文件路徑和刪除nodejs文件
可能是所有當前提供的解決方案中最簡單的方法...儘管我會使用$(...)而不是反引號。 – 2008-09-24 04:20:25
最簡單但增加了一個依賴項(我承認不是一個巨大的或奇怪的)。它也需要知道後綴。 – 2008-09-24 05:25:21
可以用來從最後刪除任何東西,基本上它只是從結尾刪除一個字符串。 – Smar 2011-08-25 15:43:46