Существует несколько различных синтаксисов регулярного выражения. (\s*)
соответствует последовательности пробела в Perl и многих других современных программах, которые подражают его regexes. Sed использует более старый вариант основных регулярных выражений, в которых круглые скобки обозначают себя и \(…\)
используется для группировки. GNU sed (версия на Linux) имеет опцию -r
использовать расширенные регулярные выражения (какой Perl regexes расширяется далее), вместо этого. Кроме того, |
обозначает себя в BRE, но должен предшествоваться обратной косой чертой в ДО.
s/[ \t]\+|/|/
пробел замен сопровождается a |
с GNU sed. Если Вы хотите совместимую POSIX команду sed, использовать s/[ ][ ]*|/|/
где каждая пара скобок содержит пространство и вкладку, как \t
и \+
расширения GNU. Кроме того, s
управляйте только заменами одно возникновение на строку: добавьте g
снабдите суффиксом для замены всех случаев.
sed -i 's/[ \t]\+|/|/g' DataStats0914.txt
Это не сложно, просто убедитесь, что покидайте OctoTORPE (#) во имя, подготовив обратную косулью (\).
find . -type f -name 'Lucky-*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
mv "${FILE}" "${newfile}" ;
done
Не уверены, как в SED, но вы можете попробовать это в корпусе Bash:
for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;
Объяснение:
Подробнее о замене параметра (что очень недоиспользуется IMO): http://www.tldp.org/ldp/ ABS / HTML / PARMETER-DUSSITITION.HTML
Чтобы выйти из #
из оболочки, просто используйте одинарные кавычки ( '#'
), двойные кавычки ( "#"
) или обратная косая черта ( \ #
).
Самым простым в вашем случае было бы использовать команду rename
(если она доступна):
rename '#U00a9' safe *.jpg
Чтобы заменить #
на что-то еще
для имен файлов в текущем каталоге (не рекурсивно), вы можете использовать Утилита GNU rename :
rename 's/#/somethingelse/' *
Такие символы, как -
, должны быть экранированы с помощью \
.
В вашем случае вы могли бы использовать
rename 's/#U00a9/safe/g' *
. Обратите внимание, что если вы хотите работать только с определенным набором файлов, например только с *. Jpg
, настройте окончательный ввод, чтобы он соответствовал этому selection:
rename 's/#U00a9/safe/g' *.jpg
Чтобы выполнить тест перед фактическим изменением имен файлов, используйте флаг -n
:
demo/> ls
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)
Для OS X переименование GNU может быть установлено с помощью homebrew : варить установить переименовать
.
Другой вариант - использовать pyRenamer
, приложение, созданное специально для пакетного переименования.
Его можно установить с помощью sudo apt-get install pyrenamer
Для получения подробных сведений об использовании см. его файл README на GitHub .
найдите список файлов и замените ключевое слово. ниже пример
find. -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
Вот решение DTK, завернутое в многоразовую функцию bash:
function renameFilesRecursively () {
SEARCH_PATH="$1"
SEARCH="$2"
REPLACE="$3"
find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
mv "${FILENAME}" "${NEW_FILENAME}";
done
}
Вот как это можно использовать:
renameFilesRecursively /home/user/my-files apple orange
Приведенные выше примеры не работали в моей системе (CentOS 5.6 ), поэтому я нашел (возможно более системную -специфичную для системы )команду, которая работает (примечание :нужно экранировать '#' с \
в командной строке):
rename \#U00a9 safe *.jpg
[Также :У меня пока недостаточно репутации, чтобы комментировать, поэтому в ответ на вопрос Нихила об использовании /g
в rename 's/old_string/new_string/g'
(, заданный в комментариях для другого ответа выше):
Используйте модификатор g
для выполнения «глобальной» замены (, то есть для замены старой строки _новой строкой _столько раз, сколько встречается старая строка _). В этом нет необходимости в моем ответе, потому что rename
будет применяться ко всем файлам, указанным с помощью *
. См.https://www.computerhope.com/unix/rename.htmдля краткого объяснения этого и других модификаторов.]
На самом деле у rename
есть опция именно для того, что называется --subst
или сокращенно -s
. Нет необходимости использовать синтаксис регулярных выражений.
rename -s '#U00a9' 'safe' *
Если вы хотите заменить несколько вхождений, используйте --subst-all
или -S
.
Кстати, я только хотел заменить строку ничем (удалить ее из имени файла )... ну, у нас также есть опция для этого -d/--delete
и-D/--delete-all
:
rename -d '#U00a9' *
Выполните следующие действия
ls Lucky-#U00a9NBC*.jpg
Будут отображаться все jpg
имена файлов сLucky-#U00a9NBC*
rename 's/Lucky-#U00a9NBC/Lucky-safeNBC/' *.jpg
После выполнения этой команды каждый Lucky-#U00a9NBC
заменяется на Lucky-safeNBC
.
ls Lucky-safeNBC*.jpg
Вы можете видеть, что все файлы переименованы
Я бы сказал, более вероятно, что #U00a9
здесь означает символ U+00A9(©
).
Если вы хотите вернуть его к ©
, закодированному в кодировке локали, вы можете использовать perl
варианты rename
(, иногда называемыеprename
):
rename '
use Encode::Locale;
use Encode;
s/#U([0-9a-f]{4})/chr hex $1/gie;
$_ = encode(locale_fs => $_)'./*'#'[uU]*