[英]sed result differs b/w command line & shell script
命令行中的以下sed
命令返回了我期望的結果。
$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./'
After-1.jpg <--- result
但是,在以下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)
結果(在同一目錄中有多個名稱相似的文件):
./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.
我哪里錯了? 謝謝。
您已在腳本中省略了該程序周圍的單引號。 不加引號的情況下,外殼程序將從.*\\.
去除反斜杠.*\\.
產生具有完全不同含義的正則表達式。 (不過,為了使替換's/.*\\./'"After-$i./"
,您將需要雙引號。您可以將單引號和雙引號's/.*\\./'"After-$i./"
或者僅添加足夠的反斜杠即可轉義轉義的轉義's/.*\\./'"After-$i./"
順序(原文如此)。
只需使用參數擴展
#!/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)
我還修復了一些引號,以防止不必要的單詞拆分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.