Esto se puede hacer usando "sed" como se muestra:
sed -ne 'y/{}/\n\n/;/^\s/D;/./P;D' input.file
donde el combo P;D establece un ciclo implícito y durante el cuerpo del ciclo nos aseguramos de imprimir campos no -vacíos.
En líneas similares:
perl -lne 'print for grep /\H/, split /{|}/' input.file
donde dividimos el registro, luego filtramos los campos no vacíos y los imprimimos uno/línea en un bucle for.
Попробуйте:
for dir in ~/Documents/CMDsh/*/
do
countFolder=$((countFolder+1))
dir=${dir%*/}
nameFolder=${dir##*/}
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
echo '------------------------------';
done
Примечания:
Всегда заключайте ссылки на переменные оболочки в двойные -кавычки. В данном случае это означало замену:
zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
с
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
Это избавляет от необходимости пытаться экранировать эти три строки кода sed.
Единственным исключением из этого правила является то, что вы явно хотите разбиения слов или расширения имени пути .
Пример может помочь. Рассмотрим простой пример с директорией с одним файлом:
$ ls
Sensation (TV Size)
Давайте создадим переменную оболочки:
$ f='Sensation (TV Size)'
Теперь давайте попробуем использовать переменную оболочки без кавычек:
$ ls $f
ls: cannot access 'Sensation': No such file or directory
ls: cannot access '(TV': No such file or directory
ls: cannot access 'Size)': No such file or directory
Обратите внимание, насколько лучше это работает, когда переменная оболочки заключена в кавычки:
$ ls "$f"
Sensation (TV Size)
При заключении переменной оболочки в кавычки экранирование не требуется.
Оболочка интерпретирует конец строки как конец команды. Таким образом, хотя точки с запятой в конце строки и не мешают, они излишни.