Unix-按行号显示文件中的某些字符 我有一个非常大的文件,需要看一些大字中间的几个字符。

Unix-按行号显示文件中的某些字符 我有一个非常大的文件,需要看一些大字中间的几个字符。,unix,sed,file-processing,Unix,Sed,File Processing,在某些文件中,是否有一种方法可以方便地显示行号l中从n1位置到n2位置的字符 我认为应该有一些方法可以使用sed,只是找不到相应的选项。您最好使用awk: awk 'NR==line_number {print substr($0,start_position,num_of_characters_to_show)}' file 例如,从第2行的第2个字符开始打印5个字符: $ cat a 1234567890 abcdefghij $ awk 'NR==2 {print substr($0,2

在某些文件中,是否有一种方法可以方便地显示行号
l
中从
n1
位置到
n2
位置的字符


我认为应该有一些方法可以使用
sed
,只是找不到相应的选项。

您最好使用
awk

awk 'NR==line_number {print substr($0,start_position,num_of_characters_to_show)}' file
例如,从第2行的第2个字符开始打印5个字符:

$ cat a
1234567890
abcdefghij
$ awk 'NR==2 {print substr($0,2,5)}' a
bcdef
如果您真的需要使用
sed
,您可以使用以下内容:

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

这将匹配行首后的
2-1=1
数字,然后捕捉
5
将其打印回来。所有这些都是在
2
行中完成的,因此我们使用
-n
来防止行的默认打印。

UNIX的优雅之处在于它能够将相对简单的程序串到管道中以实现复杂性。您可以使用
sed
唯一的解决方案,但它的可读性可能不如管道

为此,您可以结合使用
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($0,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
假设
infle
类似:

1234567890
abcdefghij
它产生:

cde

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

您可能还需要通过管道连接到
tail
以获得准确的行号。例如,要获得第25行,您需要
head-n25 | tail-n1