[[ $f =~ ^([^-]+)\ -\ ([^\.]+)\.(.*) ]] &&
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}.${BASH_REMATCH[3]}"
Здесь используется оператор проверки регулярного выражения bash = ~
, чтобы проверить, соответствует ли данное имя файла (в $ f
) шаблону: «все, кроме тире, за которым следует пробел, тире, пробел, за которым следует что угодно, кроме точки, за которой следует точка, за которой следует что-нибудь или ничего ". Если имя файла соответствует этому шаблону, совпадающие биты заключенных в скобки подразделов регулярного выражения назначаются элементам массива BASH_REMATCH.
Чтобы сделать это для каждого файла в определенной папке:
cd /to/that/folder
for f in *
do
[ -f "$f" ] || continue
[[ $f =~ ^([^-]+)\ -\ ([^\.]+)\.(.*) ]] &&
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}.${BASH_REMATCH[3]}"
done
pre=${f%%.*}
ext=${f##*.}
mv "$f" "${pre##*- } - ${pre%% -*}.$ext"
Я бы порекомендовал использовать специальное программное обеспечение для работы с csv, хотя этот случай можно было бы решить простым sed
, если в двойных кавычках нет запятых:
sed 's/^"//;s/",/,/g;s/,"/,/g;s/"$//' file
Короткоеsedрешение:
sed 's/^"\|"$//g; s/"*,"*/,/g;' file
Илиawkподход:
awk -F, '{ for(i=1;i<=NF;i++) gsub(/^"|"$/,"",$i) }1' OFS=',' file
Выходные данные (для обоих подходов):
ssl-server,ssl.server.truststore.type,jks
tez-env,enable_heap_"\n"dump,false
tez-env,heap_dump_location"\n"port,/tmp
tez-env,tez_user,tez