Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Unix sed命令未替换提供的字符串_Linux_Bash_Unix - Fatal编程技术网

Linux Unix sed命令未替换提供的字符串

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替

我正在编写一个shell脚本,其中必须将文件名和文件路径与完整的文件路径分开。例如,
/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//"
可能的重复可能的重复