Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash 复制和替换文件名字符串中的内容_Bash_Shell - Fatal编程技术网

Bash 复制和替换文件名字符串中的内容

Bash 复制和替换文件名字符串中的内容,bash,shell,Bash,Shell,我正在尝试将文件boot-1.5-SNAPSHOT.jar复制到boot-1.5.jar 我已经使用sed尝试了这个方法,但是我得到了一个错误。我知道语法不对,我希望有人能帮我完成 cp boot-* | sed -e 's:-SNAPSHOT::g' cp: missing destination file operand after ‘boot-1.5-SNAPSHOT.jar’ 这样做的想法是,脚本将不知道版本号,只知道jar将位于它试图从中复制文件的文件夹中。这就是为什么我用星号。版本

我正在尝试将文件
boot-1.5-SNAPSHOT.jar
复制到
boot-1.5.jar

我已经使用
sed
尝试了这个方法,但是我得到了一个错误。我知道语法不对,我希望有人能帮我完成

cp boot-* | sed -e 's:-SNAPSHOT::g'
cp: missing destination file operand after ‘boot-1.5-SNAPSHOT.jar’

这样做的想法是,脚本将不知道版本号,只知道jar将位于它试图从中复制文件的文件夹中。这就是为什么我用星号。版本号经常更改,因此使用
cp file file2
将不起作用。

不需要
sed
,请使用:

在这种情况下:

${parameter/pattern/string}

模式替换。模式被扩展以生成 模式与路径名扩展中的模式相同。参数展开并 模式与其值的最长匹配将替换为字符串

注意,由于您处理的是文件,所以应该引用变量(否则带有空格字符的文件会把事情搞砸)

此外,您还可以创建符号链接而不是副本:

$ ln -s "$file" "${file/-SNAPSHOT/}"

您不能像这样将
cp
命令传送到
sed
。您必须先对文件名使用
sed
,然后再进行复制

f=$(echo boot-*SNAPSHOT.jar)   
cp "$f" $(sed 's:-SNAPSHOT::' <<< "$f")
f=$(echo引导-*SNAPSHOT.jar)

cp“$f”$(sed's:-SNAPSHOT::“是的,但请强调引用更多的内容的重要性。原始文件名可能有空格;此外,PE可能会引入新的空格–或者是wordsplit。因此PE中的引号比简单扩展中的引号更重要。
$ ln -s "$file" "${file/-SNAPSHOT/}"
f=$(echo boot-*SNAPSHOT.jar)   
cp "$f" $(sed 's:-SNAPSHOT::' <<< "$f")