保留 cut 命令输出中的分隔符。

4
我有一个脚本,在搜索结果中使用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" 或类似的方式将此内容打印到控制台。输出通常至少有两行,但通常会更多。我尝试了所有的echo语法,但要么没有输出,要么输出如下:
grep: '/' is a directory

我正在Solaris上运行bash 3.00,如果有帮助的话。我真的很想通过只在cut命令末尾添加某些内容来简化这个过程,而不必操纵sed或awk。但是,如果那是唯一的方法,那就这样吧。

3个回答

3

试一下这个:

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

太好了!现在,我得查看 xargs 的手册以了解它还能做什么。 - user2773624

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会让我不寒而栗 :-/


0
尝试以下操作。注意,$PLACE没有引号。这样应该允许发生单词拆分,并且每个单词(假设没有嵌入空格)然后由printf打印出来,后接/和换行符。不过,我还没有在Solaris上的Bash 3上测试过这个。
printf "%s/\n" $PLACE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接