簡體   English   中英

sed結果與黑白命令行和shell腳本不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM