Как инвертировать строки между шаблоном в другой файл

Директива 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

2
11.03.2015, 19:09
5 ответов

Вот трехселендный подход:

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 . Это распечатает все строки, которые содержат хотя бы один символ.
0
27.01.2020, 21:50

Если единственным # является начало блока, то с помощью 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
5
27.01.2020, 21:50

Используйте так. Да, есть команда так, которая делает обратный ход cat

0
27.01.2020, 21:50

Для более консервативного, менее загадочного подхода...

awk '
  /^#/ { printf "%s",out ; print ; out = "" }
  /^[0-9]/ { out = $0 RS out }
  END { printf "%s",out }
'
2
27.01.2020, 21:50

С 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 Элете, все, если это не последняя строка. Если это последняя строка печатается сформированным шаблоном пространства по умолчанию.

2
27.01.2020, 21:50

Теги

Похожие вопросы