2014-10-09 58 views
0

我目前正在學習如何使用grepawksed。我遇到一個具有以下值的變量的問題:new_file="main_folder/test.txt"。實際上是一個包含文件的目錄。我能夠最初使用sed刪除文件擴展名。但主要目標是獲取從變量new_file中提取的文件名test(無擴展名)。我怎麼能刪除所有的最後和文件擴展名?從變量值中刪除所有內容,包括最後一個「/」

到目前爲止的一切,我有工作正在刪除擴展

new_file=`rev <<< "$new_file" | cut -d"." -f2- | rev` 

例子:

輸入

new_file="parent_folder/child_folder/file_name.txt" 
new_file2="parent_folder/child_folder/sub_child_folder/file_name2.txt" 

所需的輸出:

file_name 
file_name2 
+0

正則表達式是你的朋友。嘗試匹配任何字符後跟一個'/'。這將匹配所有可以刪除的dir/subdir/parts。 – JoErNanO 2014-10-09 23:57:56

回答

1

您可以使用basename實用程序。

$ new_file="parent_folder/child_folder/file_name.txt" 
$ x=$(basename "$new_file" .txt) 
$ echo "$x" 
file_name 

或你的情況

new_file=`basename $new_file | cut -d "." --complement -f2-` 
+0

如何將'basename $ new_file'的值賦給另一個變量? – 2014-10-10 00:01:24

+0

我認爲它只適用於'txt'文件。 – 2014-10-10 00:04:57

+0

當然,如果知道確切的擴展名,「basename」只能刪除擴展名。 – chepner 2014-10-10 00:06:40

1

通過戰略經濟對話

$ new_file="parent_folder/child_folder/file_name.txt" 
$ new_file2="parent_folder/child_folder/sub_child_folder/file_name2.txt" 
$ sed 's~.*/\([^/.]*\)\..*$~\1~' <<< "$new_file" 
file_name 
$ sed 's~.*/\([^/.]*\)\..*$~\1~' <<< "$new_file2" 
file_name2 

要值分配給另一個變量,

$ foo=$(sed 's~.*/\([^/.]*\)\..*$~\1~' <<< "$new_file2") 
$ echo "$foo" 
file_name2 

只要你可以試試這個sed命令。

$ sed 's~.*/\(.*\)\..*$~\1~' <<< "$new_file2" 
file_name2 
相關問題