2014-10-09 54 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 
相关问题