Bash sed结果与b/w命令行和;shell脚本

Bash sed结果与b/w命令行和;shell脚本,bash,shell,sed,Bash,Shell,Sed,命令行中的以下sed命令返回我所期望的结果 $ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./' After-1.jpg <--- result #!/bin/bash beforeNamePrefix=$1 i=1 while IFS= read -r -u3 -d '' base_name; do echo $base_name rename=`(echo

命令行中的以下
sed
命令返回我所期望的结果

$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./' 
After-1.jpg             <--- result
#!/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)
结果(同一目录中有多个名称相似的文件):

/Adobe ReaderScreenSnapz001.jpg

重命名为After-1 只需使用参数展开

#!/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)
#/bin/bash
beforeNamePrefix=“$1”
i=1
而IFS=read-r-u3-d''基本名称;做
回显“$base\u name”
rename=“在-$((i++)之后,${base_name##*.}”
echo“重命名为$rename”

完成3<只需使用参数扩展

#!/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)
#/bin/bash
beforeNamePrefix=“$1”
i=1
而IFS=read-r-u3-d''基本名称;做
回显“$base\u name”
rename=“在-$((i++)之后,${base_name##*.}”
echo“重命名为$rename”

完成3<您在脚本中省略了程序周围的单引号。如果不加引号,shell将去掉
*\.
中的反斜杠,从而生成一个含义完全不同的正则表达式。(不过,为了使替换生效,您需要双引号。您可以在-$i./“
之后混合使用单引号和双引号
's/*\./'”,或者只添加足够的反斜杠以转义转义序列(原文如此).

您在脚本中省略了程序周围的单引号。如果不加引号,shell将从
*\.
中删除反斜杠,从而生成一个具有完全不同含义的正则表达式。(不过,您需要双引号才能进行替换。您可以将单引号和双引号混合使用
's/*\./'“After-$i./”
或只是添加足够的反斜杠以转义转义序列(sic)。

您的
sed
命令在两个版本中都不相同。OOC,为什么您使用fd 3而不是stdin?@SiegeX:他使用的是my;我习惯性地使用fd 3,以防循环中的某些内容决定从stdin读取(通常结果很搞笑)。你的
sed
命令在两个版本中都不一样。OOC,你为什么用fd 3而不是stdin?@SiegeX:他用的是my;我习惯用fd 3,以防循环中的某些东西决定从stdin读取(通常结果很搞笑)。