【问题标题】:Keep the delimiter in the output of cut将分隔符保留在 cut 的输出中
【发布时间】:2014-04-23 23:32:27
【问题描述】:

我有一个脚本,它使用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

我在 Solaris 上运行 bash 3.00,如果有帮助的话。我真的很想亲吻这只需在 cut 命令的末尾添加一些东西,而不必使用 sed 或 awk 进行猴子。但是,如果这是唯一的方法,那就这样吧。

【问题讨论】:

    标签: bash solaris cut


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 完美!现在,我必须点击 xargs 的手册页,看看它还能做什么。
    【解决方案2】:

    试试下面的。请注意,$PLACE 没有被引用。这应该允许发生单词拆分,然后每个单词(对应于输出的一行,假设没有嵌入空格)由printf 打印,并带有以下/ 和换行符。虽然无法在 Solaris 上的 Bash 3 上对此进行测试

    printf "%s/\n" $PLACE
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2012-01-16
        相关资源
        最近更新 更多