shell:使用带粘贴的空格为输出添加前缀

时间:2016-10-22 15:28:19

标签: shell

很多时候需要在4个空格前加上一些shell输出并将其转换为有效的markdown代码。例如。在stackoverflow上发布问题或答案时。

使用Declare @D DateTime = '2016-10-22 13:30:25' Select Format(@D,'HH:mm') -- 13:30 Select Format(@D,'hh:mm:ss tt') -- 01:30:25 PM 实际上非常容易:

sed

但是如果可能的话,我想用some_command | sed -e 's/^/ /' 来做。因为paste需要2个文件作为输入,所以我想出的就是:

paste

其中some_command | paste 4_space_file - 实际上是一个整个内容为4个空格的文件。

有没有更简洁的方法来实现4_space_file而没有硬盘上的实际文件?

1 个答案:

答案 0 :(得分:2)

使用粘贴的文字答案

首先,回答你的字面问题:

some_command | paste <(printf '    \n') -

...产生与传递paste文件名相同的输出,其中一行包含四个空格,换行符作为其内容。 但是,在这种情况下paste的输出是每行四个字符的缩进;第一行有四个空格,前面有一个标签,后面的行只有一个标签。

如果你想在仍然使用paste的同时生成适当长度的输入,那么你最终会得到一些更加丑陋的东西。说(使用bash 4.0或更新版本):

ls | {
   mapfile -t lines                              # read output from ls into an array

   # our answer, here, is to move to three spaces in the input, and use paste -d' ' to
   # ...add a fourth space during processing.
   paste -d' ' \
       <(yes '   ' | head -n "${#lines[@]}") \
       <(printf '%s\n' "${lines[@]}")
}

<()process substitution语法,扩展为文件名,当读取时,将从包含的代码中生成输出。

更好的答案

对于本机bash方法,您可能还会考虑定义一个函数:

ident4() { while IFS= read -r line; do printf '    %s\n' "$line"; done; }

......供以后使用:

some_command | indent4

paste不同,它实际上在每条行上插入完全四个空格(没有插入标签),以确保输入中的确切行数(无需合成正确的长度。)

还要考虑awk

awk '{ print "    " $0; }'