У меня есть сценарий, в котором 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 строки, но обычно больше.

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

grep: '/' is a directory

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

4
user2773624 24 Апр 2014 в 03:32

3 ответа

Лучший ответ

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

PLACE=$(grep foo flatfile.txt | cut -d '/' -f 1-6 | xargs -I "%" echo %/)
1
michael501 23 Апр 2014 в 23:39

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

printf "%s/\n" $PLACE
0
iruvar 23 Апр 2014 в 23:47

Вы можете использовать одну команду 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 иногда заставляет меня вздрагивать: - /

0
Digital Trauma 24 Апр 2014 в 00:01