Linux Unix sed命令未替换提供的字符串
我正在编写一个shell脚本,其中必须将文件名和文件路径与完整的文件路径分开。例如,Linux Unix sed命令未替换提供的字符串,linux,bash,unix,Linux,Bash,Unix,我正在编写一个shell脚本,其中必须将文件名和文件路径与完整的文件路径分开。例如,/home/loneranger/Documents/test/file.dat是完整的路径。我想分离名称和路径,并将它们放入变量中。到目前为止,我能够使用basename命令分离文件名 file_name =$(basename $path) file_location =`echo $path | sed 's/$file_name//' ` 但是sed命令不起作用。当我在命令行外部通过file.dat替
/home/loneranger/Documents/test/file.dat
是完整的路径。我想分离名称和路径,并将它们放入变量中。到目前为止,我能够使用basename命令分离文件名
file_name =$(basename $path)
file_location =`echo $path | sed 's/$file_name//' `
但是sed命令不起作用。当我在命令行外部通过file.dat替换文件名来执行它时,它就工作了。不知道为什么会这样。谁能解释一下
PS:很抱歉,我在移动设备上打字时格式不好。工具
dirname
可以满足您的要求:
file_name=$(basename $path)
file_location=$(dirname $path)
sed命令不起作用,因为bash不在单引号内展开变量
sed 's/$file_name//'
^ single quote
^ variable inside single quote not expanded
使用双引号或打开变量周围的单引号:
sed "s/$file_name//"
sed 's/'$file_name'//'
但是正如前面所说,工具dirname
可以满足您的需要
还要注意,在变量赋值中,不能在等号周围加空格
file_name =$(basename $path)
^ there should be no space here
上面的行没有将basename
的结果分配给变量file\u name
。相反,它将尝试使用一个参数执行命令file\u name
,该参数是basename
的结果
file_name=$(basename $path)
^ no space here
此行将定义变量。工具
dirname
执行您想要的操作:
file_name=$(basename $path)
file_location=$(dirname $path)
sed命令不起作用,因为bash不在单引号内展开变量
sed 's/$file_name//'
^ single quote
^ variable inside single quote not expanded
使用双引号或打开变量周围的单引号:
sed "s/$file_name//"
sed 's/'$file_name'//'
但是正如前面所说,工具dirname
可以满足您的需要
还要注意,在变量赋值中,不能在等号周围加空格
file_name =$(basename $path)
^ there should be no space here
上面的行没有将basename
的结果分配给变量file\u name
。相反,它将尝试使用一个参数执行命令file\u name
,该参数是basename
的结果
file_name=$(basename $path)
^ no space here
此行将定义变量。它不起作用,因为您在简单引号(
')
中使用了$file\u name
)。使用双引号“
启用变量转换
file_location =`echo $path | sed "s/$file_name//"
它不起作用,因为您在简单引号(
”
)中使用了$file\u name
。请使用双引号“
启用变量转换
file_location =`echo $path | sed "s/$file_name//"
可能的重复可能的重复