hak*_*kre 3 sed text-processing uniq
处理文本逐行删除每行的前导空格很容易:
$ LC_ALL=C git ls-files | sed -nE 's:^.*(\.[^./]+)$:\1:p' \
| sort | uniq -c | sort -snr > lines # create example "lines" file
$ cat lines # "lines" example file
30 .md
8 .png
4 .yml
1 .css
1 .gitignore
1 .ico
1 .sh
1 .txt
$ sed -Ee 's/^ +//' lines # removing leading spaces (U+0020)
30 .md
8 .png
4 .yml
1 .css
1 .gitignore
1 .ico
1 .sh
1 .txt
Run Code Online (Sandbox Code Playgroud)
但是,如果只有第一行应该设置要删除所有后续行的空格数,如何实现?输出将如下所示:
30 .md
8 .png
4 .yml
1 .css
1 .gitignore
1 .ico
1 .sh
1 .txt
Run Code Online (Sandbox Code Playgroud)
我想要实现的是将它通过管道传输到column(1)并使输出更密集,但保持所有行的水平间距。模拟:
$ column -x lines | expand -t 8
30 .md 8 .png 4 .yml
1 .css 1 .gitignore 1 .ico
1 .sh 1 .txt
Run Code Online (Sandbox Code Playgroud)
现在没有在左侧修剪大量空间,因为uniq(1)使用-c选项添加它们,因为它确实右对齐数字(在位置 8)。
只要我假设最大计数是固定的,例如最多两位数,我就可以对其进行硬编码:
sed -Ee 's/^ {5}//' lines | column -x | expand -t 8
30 .md 8 .png 4 .yml 1 .css 1 .gitignore
1 .ico 1 .sh 1 .txt
Run Code Online (Sandbox Code Playgroud)
Gnu sed:将前导空格存储在保持中,然后从每一行中去除这么多的前导空格。假设行按所示排序。
sed -Ee '
1{h;s/\S.*//;x;}
G;s/^(\s*)(.*)\n\1$/\2/
' file
Run Code Online (Sandbox Code Playgroud)
awk '
NR==1 {
l0=length()
$1=$1
re = "^\\s{" l0-length() "}"
}
sub(re, "")+1
' file
Run Code Online (Sandbox Code Playgroud)
perl -lpe '
$x //= do{/^\s*/g;+pos;};
$_ = substr($_,$x);
' file
Run Code Online (Sandbox Code Playgroud)