将分隔符保留在剪切输出中

时间:2014-04-23 23:32:27

标签: bash solaris 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

我在Solaris上运行bash 3.00,如果这有帮助的话。我真的很喜欢K.I.S.S.这只需要在cut命令的末尾添加一些东西,而不必使用sed或awk。但是,如果这是唯一的方式,那就这样吧。

3 个答案:

答案 0 :(得分:1)

试试这个:

PLACE=$(grep foo flatfile.txt | cut -d '/' -f 1-6 | xargs -I "%" echo %/)

答案 1 :(得分:0)

尝试以下方法。请注意,$PLACE未引用。这应该允许分词发生,然后printf使用以下/和换行符打印每个单词(对应于输出的一行,假设没有嵌入的空格)。尽管

,Haven还是能够在Solaris上的Bash 3上测试这个
printf "%s/\n" $PLACE

答案 2 :(得分:0)

您可以使用一个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有时让我不寒而栗: - /