很多时候需要在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
而没有硬盘上的实际文件?
答案 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; }'