Обратите внимание, что не ls
расширяет подстановочные знаки, а оболочка.
bash
может сделать все свои глобусы нечувствительными к регистру с помощью опции nocaseglob
, но, в отличие от ksh93
или zsh
, не имеет оператора глобуса для наличия одного глобуса или части одного глобуса, нечувствительного к регистру.
Тем не менее, вы всегда можете:
ls -ld -- *.[jJ][pP][gG]
Что также имеет то преимущество, что не оставляет на усмотрение локали решение о том, что является вариантом нижнего или верхнего регистра данной буквы (, например, является ли вариант верхнего регистраgif
GIF
или 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)
В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
Вот один из способов, когдаawk
(p
удерживает предыдущую строку, когда NF
равно нулю ).
awk 'NF {p = $0} {print p}' file
Когда строка не пуста, мы сохраняем строку вp
(для будущего использования )и печатаем p
.
КогдаNF==0
(для пустых строк )мы печатаем только p
.
Использование прилагаемого входа и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
$ 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
Добавление к существующим ответам:
awk 'NR<2 && !NF{next} NF{print} !NF{print line} NF{line=$0}' test
... также позаботится о пустой первой строке (, игнорируя ее, так как у нее нет предыдущего ввода ).