简体   繁体   中英

sed result differs b/w command line & shell script

The following sed command from commandline returns what I expect.

$ 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.

#!/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).

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM