Директива for f in $(find .)
разделяет список элементов для итерации пространством. В современной оболочке, как zsh, могли использоваться флаги расширения.
for f in "${(@f)$(find .)}" ; do echo "$f" ; done
Пребывание с bash
, мы можем работать вокруг этого, любят упомянутый в другом вопросе, изменяющем входной разделитель, символ раньше разделял элементы, временно при присвоении результатов find
к переменной. Отключение бахвалящийся в течение времени, будучи предотвращает расширение подстановочных символов, такой как *
в них.
set -f # Disable globbing.
IFS=$(echo -e '\0') files=( $(find . -print0) ) # Read newline separated files into an array.
for f in ${files[@]}; do echo $f; done
set +f # Reenable globbing.
Но это просто смещает проблему, теперь она не будет работать, когда новая строка будет в любом имени файла. Существует всего одна вещь, запрещенная в, вероятно, всех файловых системах, который является нулевым символом. Но переменные в ударе не могут содержать это, таким образом, мы не можем присвоить его IFS
.
С другой стороны, xargs может использоваться для передачи путей от find
к другой программе. Используя -print0
команда к find
и -0
переключатель к xargs
, они используют нулевой символ в качестве разделителя. Добавление -n1
к xargs
назовите дескрипторы одним именем файла за один раз.
find . -print0 | xargs -0 -n1 echo
Вот трехселендный подход:
sed 's/^#/\n#/' file |
perl -00lne '@A=split(/\n/); print shift(@A); print join "\n", reverse @A' |
grep .
SED
добавляет новую строку перед каждой строкой, которая начинается с #
. Это позволяет нам использовать режим параграфа Perl (см. Ниже). Параметры Perl:
-00
Активирует «Режим абзаца» в «строке» определяется 2 \ N
символами. -L
: удаляет трейлинные новости и добавляет \ N
к каждому Print
. -N
: прочитайте строку входной файлы по строке (или абзацу в этом случае). -E
: скрипт, который будет работать на каждой строке. Сценарий Perl:
@ A = Split (/ \ N /);
: разделить эту строку (абзац) в массив @A
, делая каждую отдельную линию (реальная линия Здесь, а не абзац) в элемент массива. Сдвиг печати (@A);
: удалить 1-й элемент @A
(строка заголовка) и распечатайте его. Распечатать соединение «\ N», обратный @A '
: обратное оставшееся элементы @A
, подключите их с \ N
символами и печатью. GREP.
: просто грязный взлом для удаления пустых строк, добавленных SED
. Это распечатает все строки, которые содержат хотя бы один символ. Если единственным #
является начало блока, то с помощью awk
можно попробовать
$ awk -F'\n' 'BEGIN{RS="#"}NR>1{print "#"$1;for(i=NF-1;i>1;i--)print $i}' file
Результат:
#Start para
3 you dq
2 welcomes dq
1 world dq
0 hello dq
#Start para
2 you tq
1 are tq
0 how tq
#Start para
4 world dq
3 the dq
2 to dq
1 hello dq
0 say dq
Для более консервативного, менее загадочного подхода...
awk '
/^#/ { printf "%s",out ; print ; out = "" }
/^[0-9]/ { out = $0 RS out }
END { printf "%s",out }
'
С SED
:
sed '/#Start para/{x;G;s/^\n//;p;s/.*//;x;d};G;s/\n$//;h;$!d' input.file
для линий, которые состоят #start Para
добавить его в конец пробела
E x
Изменение: Узор <-> Удерживает пространство , затем возвращает данные из HOLD Appendin G
шаблон . (То же самое можно сделать H
H (Добавить к удержанию), затем вернуться к шаблону g
). Если пространство удержания было пустым, узор начнется с пустой строки, чтобы его удалить S / ^ \ N //
и P
Собранные линии RINT. Следующие команды (до }
). Стремитесь к чистым пробелам и шаблонам и перейти к следующей строке.
Для других строк (которые не состоят #start Para
) AppEngin G
Удерживайте место для шаблона, удалите пустую строку (если удержание было пустым), затем поместите шаблон в Держите и начать новый цикл D
Элете, все, если это не последняя строка. Если это последняя строка печатается сформированным шаблоном пространства по умолчанию.