Shell,列-t,将第N个空格后的所有内容视为最后一列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell,列-t,将第N个空格后的所有内容视为最后一列相关的知识,希望对你有一定的参考价值。
我想打印一个两列表。在第一列中是路径(没有空格),在第二列中是名称(带空格)。我想让column
将第N个空格(N = 2)之后的所有内容视为属于单个列。
我不需要使用column
,但我想要一些简短的东西。注意:我不是在寻找其他只需要两列的解决方案。
mark@localhost ~/.config/chromium/Default/Extensions
% for f in */*/manifest.json; do
echo -n "$f ";
cat $f | jq -r '.name + " " + .version';
done | column -t
cjpalhdlnbpafiamejdnhcphjbkeiagm/1.14.22_0/manifest.json uBlock Origin 1.14.22
dbepggeogbaibhgnhhndojpepiihcmeb/1.62.4_0/manifest.json Vimium 1.62.4
dffhipnliikkblkhpjapbecpmoilcama/0.3_0/manifest.json Swap My Cookies 0.3
gcbommkclmclpchllfjekcdonpmejbdp/2017.12.6_0/manifest.json __MSG_about_ext_name__ 2017.12.6
gdbofhhdmcladcmmfjolgndfkpobecpg/4.19_0/manifest.json Don't track me Google 4.19
pkehgijcmpdhfbdbbnkijodmdjhbjlgp/2017.11.20_0/manifest.json __MSG_name__ 2017.11.20
答案
获取一些command
(可能是你的循环)的输出,并将前两个空格后的所有内容格式化为一列的一部分:
command | sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' input | column -ts' ' | sed 's/\t/ /g'
例如,将此文件视为输入:
$ cat input
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
我们可以通过以下方式生成您想要
$ sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' input | column -ts' ' | sed 's/\t/ /g'
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
How it works
我们分三个步骤处理文本:
sed 's/ /\t/g; s/\t/ /2; s/\t/ /1'
这将使用制表符替换除前两个之外的所有空格。column -ts' '
这会执行column -t
格式化,但仅将其应用于空格分隔的字段。sed 's/\t/ /g'
这会将第三列中的选项卡转换回空白。
Shell function for ease-of-use
首先,定义:
format() { sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' "$@" | column -ts' ' | sed 's/\t/ /g'; }
现在,我们可以以快速简单的方式应用格式,作为管道的一部分:
$ cat input | format
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
或者,对文件进行操作:
$ format input
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
要使format
的定义永久化,请将其放在~/.bashrc
文件中。
Formatting for N number of columns
让我们定义一个允许我们指定列数的函数:
frmt() { [[ $1 =~ ^[0-9]+$ ]] && sed "s/ /\t/$1g" "${@:2}" | column -ts' ' | sed 's/\t/ /g'; }
我们可以格式化两列文件:
$ frmt 2 input
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
或3列:
$ frmt 3 input
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
我们可以使用相同的函数作为管道的一部分:
$ cat input | frmt 3
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr
这种方法使用GNU sed,因此可以在Linux上运行,包括ArchLinux,但不适用于OSX / BSD系统。
另一答案
你可以试试
command | sed 's/[^ ]*/&\t/' | column -ts $'\t'
以上是关于Shell,列-t,将第N个空格后的所有内容视为最后一列的主要内容,如果未能解决你的问题,请参考以下文章