Вот другое решение:
sed 's/^<[^>]*>//g' file.txt | tr '\012' '|' | awk -F'|' '{OFS=FS; print $3,$2,$1}'
9251000014|220095|Operation successful.
Если вы хотите удалить завершающий .
вы можете сделать это либо с помощью sed
, либо awk
(нет необходимости в обоих). Вот простое решение с sed
:
sed -e 's/^<[^>]*>//g' -e 's/\.$//' file.txt
Прямо из Greg's Wiki:
# Rename all *.txt to *.text
for f in *.txt; do
mv -- "$f" "${f%.txt}.text"
done
*.txt
- это шаблон глобуса, использующий *
как подстановочный знак для поиска любой строки. *.txt
соответствует всем именам файлов, заканчивающимся на '.txt'.
--
отмечает конец списка опций. Это позволяет избежать проблем с именами файлов, начинающимися с дефисов.
${f%.txt}
- это расширение параметра, заменяемое значением переменной f
с удалением .txt
из конца.
Также смотрите запись о том, почему вы не должны разбирать ls
.
Если вам нужно использовать basename
, ваш синтаксис будет таким:
for f in *.txt; do
mv -- "$f" "$(basename -- "$f" .txt).text"
done
Если вы хотите узнать, что пошло не так в вашей версии: вы использовали $ files
вместо $ x
в команде basename. Так что это должно работать (хотя и не проверено):
for x in *.txt
do
mv "$x" "`basename "$x" .txt`.text"
done
На основе ответа @Prince John Wesley, вот простой сценарий bash для изменения всех расширений файлов в текущем каталоге с ext1
на ext2
. Также выводит имена переименовываемых файлов.
#!/bin/bash
for f in *.$1
do
[ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done
Пример использования (при условии, что имя сценария change-ext
):
change-ext ext1 ext2
скажем, ваши файлы разбросаны по разным каталогам, Предполагая, что dirx - ваш родительский каталог, это можно сделать с помощью find:
for f in `find /dirx -iname '*.txt' -type f -print`;do mv "$f" ${f%.txt}.text; done
rename "s/oldExtension/newExtension/" *.txt
Вышеуказанное работает нормально, но ограничено текущим каталогом. Попробуйте выполнить команду ниже, гибкую с подкаталогами. Он переименует все файлы .txt
в структуре каталогов с новым расширением.
find . -type f -name "*.txt" -exec rename 's/\.txt$/.newext/' '{}' \;
Простая команда, rename
из util-linux
, сделает это за вас, она заменит все случаи "txt" на "text" во всех файлах, соответствующих "*.txt":
rename txt text *.txt
Вот как я меняю все расширения файлов в текущем каталоге Debian.
rename "s/oldExtension$/newExtension/" *.txt
(Это команда Perl rename
, а не команда util-linux
. См. Почему утилита переименования в Debian / Ubuntu отличается от той, что используется в других дистрибутивах , например CentOS? )
Вот что у меня работает:
find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
Ответы здесь со ссылкой на s/oldExtension/newExtension/
неверны. Если вы используете s/txt/text/
, вы должны преобразовать footxt.txt
в footext.txt
, что вам не нужно. Даже если вы используете s/.txt/.text/
, это преобразует footxt.txt
в fo.text.txt
.
Вы должны использовать \.
для соответствия периоду(.
будет соответствовать любому символу ). И замыкающий $
для соответствия концу строки. Только это будет правильно соответствовать расширению.
rename 's/\.txt$/.text/' *.txt
rename 's/\.old$/.new/' *.old
Когда вы
do not have an extension for the source files
и целевое расширение .text вы бы сделали это так-
for f in *; do mv -- "$f" "${f%.\*}.text"; done