[英]sed result differs b/w command line & shell script
The following sed
command from commandline returns what I expect. 命令行中的以下sed
命令返回了我期望的结果。
$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./'
After-1.jpg <--- result
Howerver, in the following bash script, sed
seeems not to act as I expect. 但是,在以下bash脚本中, sed
似乎不符合我的预期。
#!/bin/bash
beforeNamePrefix=$1
i=1
while IFS= read -r -u3 -d '' base_name; do
echo $base_name
rename=`(echo ${base_name} | sed -e s/.*\./After-$i./g)`
echo 'Renamed to ' $rename
i=$((i+1))
done 3< <(find . -name "$beforeNamePrefix*" -print0)
Result (with several files with similar names in the same directory): 结果(在同一目录中有多个名称相似的文件):
./Adobe ReaderScreenSnapz001.jpg
Renamed to After-1. <--- file extension is missing.
./Adobe ReaderScreenSnapz002.jpg
Renamed to After-2.
./Adobe ReaderScreenSnapz003.jpg
Renamed to After-3.
./Adobe ReaderScreenSnapz004.jpg
Renamed to After-4.
Where am I wrong? 我哪里错了? Thank you. 谢谢。
You have omitted the single quotes around the program in your script. 您已在脚本中省略了该程序周围的单引号。 Without quoting, the shell will strip the backslash from .*\\.
不加引号的情况下,外壳程序将从.*\\.
去除反斜杠.*\\.
yielding a regular expression with quite a different meaning. 产生具有完全不同含义的正则表达式。 (You will need double quotes in order for the substitution to work, though. You can mix single and double quotes 's/.*\\./'"After-$i./"
or just add enough backslashes to escape the escaped escape sequence (sic). (不过,为了使替换's/.*\\./'"After-$i./"
,您将需要双引号。您可以将单引号和双引号's/.*\\./'"After-$i./"
或者仅添加足够的反斜杠即可转义转义的转义's/.*\\./'"After-$i./"
顺序(原文如此)。
Just use Parameter Expansion 只需使用参数扩展
#!/bin/bash
beforeNamePrefix="$1"
i=1
while IFS= read -r -u3 -d '' base_name; do
echo "$base_name"
rename="After-$((i++)).${base_name##*.}"
echo "Renamed to $rename"
done 3< <(find . -name "$beforeNamePrefix*" -print0)
I also fixed some quoting to prevent unwanted word splitting 我还修复了一些引号,以防止不必要的单词拆分
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.