Объединяйте строки всякий раз, когда строка соответствует в файле

Легко динамически построить строку и оценить ее:

eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list  |tr '\n' ' ' )"

где list будет файлом (возможно, fifo), представляющим список расширений, из которых вы хотите построить команду.

<() по сути создает безымянные FIFO. Альтернативой без eval может быть использование именованных:

while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe  #remove the named pipes when done

Вышеприведенное предполагает, что в вашем каталоге нет других имен файлов, заканчивающихся на ".pipe".

0
01.03.2018, 04:35
3 ответа

POSIBLEMENTE:

LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file

Es sencillo:

  • $!N:con cada línea excepto la última, leyendo la línea siguiente
  • /value:/b1:si el patrón coincide, vaya a la rama llamada1
  • P;D:si el patrón no coincide, imprima la línea actual, comience un nuevo ciclo con la línea de lectura de $!Nanterior. Entonces, si tiene line1\nline2, imprima line1, comience un nuevo ciclo con line2, $!Nhaga que sea line2\nline3y así sucesivamente.
  • :1:define la rama denominada1
  • 's/\n[[:space:]]*/ /':en la rama 1, reemplace la nueva línea incrustada y los espacios iniciales con un espacio.
1
28.01.2020, 02:32

Mantenlo simple:

sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'

Haga un ciclo N;P;Dpara procesar siempre dos líneas a la vez (no se necesita $!aquí por cierto ). En el interior, reemplace una nueva línea con espacios seguidos de value:con un solo espacio en blanco. Eso es.

1
28.01.2020, 02:32

Вы также можете попробовать использовать sed

sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file

Пояснение:

  • /условие запуска
  • : {$если строка заканчивается на: {
  • /Конечное состояние
  • {Группа операций пуска
  • N;объединить строку ниже с соответствующей строкой
  • s/\n//gпроизводит замену\n
  • }Конец рабочей группы

Опционально для форматирования вывода

  • 's/{.*v/{ v/g'выполнить другое выражение, в котором заменить все пробелы между {иv()одним пробелом

Насколько я понимаю, Solaris не поддерживает параметр -i, поэтому для внесения изменений необходимо выполнить перенаправление вывода.

Попробуйте

0
28.01.2020, 02:32

Теги

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