Сохраняйте разделитель в выводе cut

У меня есть скрипт, который использует cut для выбора некоторой информации из поиска, содержащего абсолютные пути. Это выглядит примерно так:

PLACE=$(grep foo flatfile.txt | cut -d '/' -f 1-6)

Вывод выглядит следующим образом:

machine1:/path/to/where/foo/is
machine2:/another/path/to/find/foo

Мне нужно, чтобы это выглядело так:

machine1:/path/to/where/foo/is/
machine2:/another/path/to/find/foo/

Это нужно вывести на консоль в конце скрипта с помощью echo "$PLACE" или что-то в этом роде. Вывод всегда будет не менее 2 строк, но обычно больше.

Я перепробовал все, что мог придумать, с помощью эха, но он либо вообще не показывает вывод, либо дает вывод:

grep: '/' is a directory

Я запускаю bash 3.00 на Solaris, если это поможет. Я бы очень хотел K.I.S.S. это просто за счет того, что что-то прикреплено к концу команды cut, и вам не нужно возиться с sed или awk. Но если это единственный путь, то так тому и быть.


person user2773624    schedule 23.04.2014    source источник


Ответы (3)


попробуй это :

PLACE=$(grep foo flatfile.txt | cut -d '/' -f 1-6 | xargs -I "%" echo %/)
person michael501    schedule 23.04.2014
comment
Идеальный! Теперь мне нужно открыть справочные страницы для xargs, чтобы узнать, что еще он может сделать. - person user2773624; 24.04.2014

Попробуйте следующее. Обратите внимание, что $PLACE не заключен в кавычки. Это должно разрешить разделение слов, и каждое слово (которое соответствует одной строке вашего вывода, при условии отсутствия встроенных пробелов) затем печатается с помощью printf с последующим / и новой строкой. Однако не удалось проверить это на Bash 3 на Solaris.

printf "%s/\n" $PLACE
person iruvar    schedule 23.04.2014

Вы можете использовать одну команду sed вместо нескольких других команд:

$ PLACE=$(sed -n '/foo/s:\(\([^/]\+/\)\{6\}\)\(.*\)\+:\1:p' flatfile.txt)
$ echo "$PLACE"
machine1:/path/to/where/foo/is/
machine2:/another/path/to/find/foo/
$ 

... и тут я вспомнил, почему sed иногда заставляет меня содрогаться :-/

person Digital Trauma    schedule 24.04.2014