Если только продвижение пробелов должно быть преобразовано:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
С комментариями:
sed '
h; # save a copy of the pattern space (filled with the current line)
# onto the hold space
s/[^ ].*//; # remove everything starting with the first non-space
# from the pattern space. That leaves the leading space
# characters
s/ / /g; # substitute every sequence of 4 spaces with 2.
G; # append a newline and the hold space (the saved original line) to
# the pattern space.
s/\n *//; # remove that newline and the indentation of the original
# line that follows it'
Также взгляд на энергию 'ts'
установка и :retab
команда
Я не вижу способ сделать это из страницы справочника, но можно всегда фильтровать результаты. Следующее не принимает новых строк в Ваших именах файлов:
tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'
Как это работает
Путем установки разделителя полей на /
, последнее поле awk
знает о ($NF
) или имя файла, если оно обрабатывает имя файла или пустое, если оно обрабатывает имя каталога (tar
добавляет запаздывающая наклонная черта к именам каталогов). Так, в основном говорим мы awk
распечатать последнее поле, если это не пусто.
Принятие ни одних из имен файлов содержит новые строки:
tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'
Первая команда sed удаляет все перед последним /
на строке, так, чтобы только часть имени файла была распечатана. Вторая команда удаляет строки, которые теперь пусты, т.е. строки, которые закончились в a /
, которые являются каталогами.
Используя предложение Джозефа Р., можно использовать регулярное выражение [^ /] $
в grep
для файлов, ища строки, не заканчивающиеся на /
.
tar tzf archive.tar.gz | grep -e "[^ /] $"
Сpax
(командой POSIX для чтения tar
файлов):
pax -'s@.*/@@' < file.tar
(, в котором перечислены все файлы независимо от их типа, включая каталоги ).