Unix - 按行号显示文件中的一些字符

Unix - show some characters in file by line number

我有一个非常大的文件,需要查看一些大行中间的几个字符。

有没有办法在某些文件中轻松显示行号 l 中从 n1 位置到 n2 位置的字符?

我觉得sed应该有什么办法,就是找不到相应的选项。

你最好使用awk:

awk 'NR==line_number {print substr([=10=],start_position,num_of_characters_to_show)}' file

例如第2行从第2个字符开始打印5个字符:

$ cat a
1234567890
abcdefghij
$ awk 'NR==2 {print substr([=11=],2,5)}' a
bcdef

如果你真的需要使用sed,你可以使用类似的东西:

$ sed -rn '2{s/^.{1}(.{5}).*$//;p}' a
bcdef

这会匹配行首之后的 2-1=1 位数字,然后捕获 5 以将它们打印回来。而所有这些都是在 2 行中完成的,所以我们使用 -n 来防止该行的默认打印。

UNIX 的优雅一直在于它能够将相对简单的程序串成管道以实现复杂性。您可以做一个 sed-only 解决方案,但它不太可能像管道那样可读。

为此,您可以结合使用 sed 来获取特定行,并使用 cut 来获取该行上的字符位置:

pax> echo '12345
...> abcde
...> fghij' | sed -n 2p | cut -c2-4
bcd

如果你只想使用一个单一工具,awk可以做到:

pax> echo '12345
...> abcde
...> fghij' | awk 'NR==2{print substr([=11=],2,3);exit}'
bcd

Perl 也可以:

pax> echo '12345
...> abcde
...> fghij' | perl -ne 'if($.==2){print substr($_,1,3); exit}'

在这两种情况下,它都会在相关行之后退出以避免处理文件的其余部分。

一种仅使用 的解决方案,即在子字符串前后插入换行符并将它们用作标志以删除不在它们之间的所有内容,例如:

sed -n '2 { s/.\{5\}/&\n/; s/.\{2\}/&\n/; s/[^\n]*\n//; s/\n.*//; p; q }' infile

假设infile喜欢:

1234567890
abcdefghij

它产生:

cde

不是从 25 的范围,而是从零开始计数并且不包括末尾(因此字符 2、3 和 4)。您可以处理它或在命令之前进行一些运算。