Заменить пустую строку содержимым строки выше

Обратите внимание, что не lsрасширяет подстановочные знаки, а оболочка.

bashможет сделать все свои глобусы нечувствительными к регистру с помощью опции nocaseglob, но, в отличие от ksh93или zsh, не имеет оператора глобуса для наличия одного глобуса или части одного глобуса, нечувствительного к регистру.

Тем не менее, вы всегда можете:

ls -ld -- *.[jJ][pP][gG]

Что также имеет то преимущество, что не оставляет на усмотрение локали решение о том, что является вариантом нижнего или верхнего регистра данной буквы (, например, является ли вариант верхнего регистраgifGIFили GİF? ).

Или с опцией extglob, чтобы также покрытьjpeg:

ls -ld -- *.[jJ][pP]?([eE)[gG]

С zshи с опцией extendedglob(set -o extendedglob):

ls -ld -- *.(#i)jp(e|)g

Сksh93:

ls -ld -- *.~(i)jp?(e)g

Или:

ls -ld -- *.~(i:jp?(e)g)
5
11.12.2020, 13:40
5 ответов

Вawk(обратите внимание, что этот будет печатать любые пустые строки, которые идут перед первой не -пустой):

$ awk '{ if(! NF){$0=last}else{last=$0;}}1' file
101 abc group1
765 efg group2 
345 hij group4 
345 hij group4 
456 gfd group9 
762 ert group7 
762 ert group7 
762 ert group7 
554 fgt group11  

Пояснение:

NFсодержит количество полей. Если строка пуста, полей нет, поэтому переменная будет 0.

  • if(! NF){$0=last}:если количество полей равно 0 (пустая строка ), установить текущую строку($0)в значение переменной last.
  • else{last=$0;}:если есть поля, поэтому эта строка не пуста, установите lastдля хранения содержимого этой строки.
  • 1:одинокая цифра в конце — это трюк awk :когда что-то оценивается как истинное (1 или любое другое целое число больше 0 всегда истинно, так как 0 равно ложному )awk напечатает текущую строку. Так что 1эквивалентно print $0.
$ awk '! NF ? $0=last : last=$0;' file
101 abc group1
765 efg group2 
345 hij group4 
345 hij group4 
456 gfd group9 
762 ert group7 
762 ert group7 
762 ert group7 
554 fgt group11  

Пояснение Это та же идея, что и выше, но написанная более лаконично. Мы используем тернарный оператор . Поскольку одно из двух условий всегда будет истинным (, либо NFбудет истинным, либо не истинным, поэтому тернарный оператор всегда будет возвращать истину ), оба результата приводят к выводу строки (, за исключением случаи, когда строка пуста и не было замечено не -пустых строк или если строка состоит только из0). Однако, если NFне установлено,мы устанавливаем $0на last, и если он установлен, мы устанавливаем lastна $0. Результатом является результат, который мы хотим.

Поскольку приведенное выше не будет печатать строки, которые просто 0, вы можете использовать это вместо того, что для вас проблема:

awk '{! NF ? $0=last : last=$0};1' file
5
28.04.2021, 23:02

Вот один из способов, когдаawk(pудерживает предыдущую строку, когда NFравно нулю ).

awk 'NF {p = $0} {print p}' file

Когда строка не пуста, мы сохраняем строку вp(для будущего использования )и печатаем p.

КогдаNF==0(для пустых строк )мы печатаем только p.

9
28.04.2021, 23:02

Использование прилагаемого входа иsed:

$ sed -n '/^$/{g;};h;p' infile
101 abc group1
765 efg group2
345 hij group4
345 hij group4
456 gfd group9
762 ert group7
762 ert group7
762 ert group7
554 fgt group11 
$

Примечание :'/^$/{g;};h;p', очевидно, чаще/правильно пишется как '/^$/g;h;p'. Просто мой стиль!

Как указал guest_7(спасибо ), команду sedтакже можно записать проще какsed '/^$/g;h' infile

Как указал terdonи что-то, о чем я изначально не подумал, "пустые" строки могут содержать пробелы или символы табуляции (пробелы ). В этом случае более надежным решением будет:

$ sed '/^\s*$/g;h' infile

и более переносимым решением, поддерживающим различные локали, является:

$ sed '/^[[:blank:]]*$/g;h' infile
5
28.04.2021, 23:02
$ awk '!NF{$0=p} {p=$0} 1' file
101 abc group1
765 efg group2
345 hij group4
345 hij group4
456 gfd group9
762 ert group7
762 ert group7
762 ert group7
554 fgt group11
3
28.04.2021, 23:02

Добавление к существующим ответам:

awk 'NR<2 && !NF{next} NF{print} !NF{print line} NF{line=$0}' test

... также позаботится о пустой первой строке (, игнорируя ее, так как у нее нет предыдущего ввода ).

0
28.04.2021, 23:02

Теги

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