首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed结果与b/w命令行和shell脚本不同

sed结果与b/w命令行和shell脚本不同
EN

Stack Overflow用户
提问于 2012-02-06 02:37:47
回答 2查看 246关注 0票数 0

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

代码语言:javascript
复制
$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./' 
After-1.jpg             <--- result

然而,在下面的bash脚本中,sed看起来并不像我期望的那样。

代码语言:javascript
复制
#!/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)

结果(在同一目录中有几个名称相似的文件):

代码语言:javascript
复制
./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.

我哪里错了?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-06 02:47:57

只需使用参数扩展

代码语言:javascript
复制
#!/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)

我还修复了一些引号,以防止不需要的单词拆分

票数 1
EN

Stack Overflow用户

发布于 2012-02-06 02:48:45

您在脚本中省略了程序两边的单引号。如果没有引号,shell将去掉.*\.中的反斜杠,生成一个含义完全不同的正则表达式。(不过,您需要使用双引号才能使替换生效。您可以混合使用单引号和双引号's/.*\./'"After-$i./",或者只添加足够的反斜杠来转义转义序列(原文如此)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9151875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档