Результат sed отличается ч / б командной строкой и сценарием оболочки - PullRequest
0 голосов
/ 05 февраля 2012

Следующая команда 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.

Где я ошибаюсь?Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Вы пропустили одинарные кавычки вокруг программы в вашем скрипте.Без кавычек оболочка будет отбрасывать обратную косую черту из .*\., получая регулярное выражение с совершенно другим значением.(Однако для того, чтобы замещение работало, вам понадобятся двойные кавычки. Вы можете смешивать одинарные и двойные кавычки 's/.*\./'"After-$i./" или просто добавить достаточно обратных косых черт, чтобы избежать экранированной escape-последовательности (sic).

1 голос
/ 05 февраля 2012

Просто используйте Расширение параметров

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

Я также исправил некоторые цитаты, чтобы предотвратить нежелательное расщепление слов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...