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 的解决方案,即在子字符串前后插入换行符并将它们用作标志以删除不在它们之间的所有内容,例如:
sed -n '2 { s/.\{5\}/&\n/; s/.\{2\}/&\n/; s/[^\n]*\n//; s/\n.*//; p; q }' infile
假设infile
喜欢:
1234567890
abcdefghij
它产生:
cde
不是从 2
到 5
的范围,而是从零开始计数并且不包括末尾(因此字符 2、3 和 4)。您可以处理它或在命令之前进行一些运算。
我有一个非常大的文件,需要查看一些大行中间的几个字符。
有没有办法在某些文件中轻松显示行号 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 的解决方案,即在子字符串前后插入换行符并将它们用作标志以删除不在它们之间的所有内容,例如:
sed -n '2 { s/.\{5\}/&\n/; s/.\{2\}/&\n/; s/[^\n]*\n//; s/\n.*//; p; q }' infile
假设infile
喜欢:
1234567890
abcdefghij
它产生:
cde
不是从 2
到 5
的范围,而是从零开始计数并且不包括末尾(因此字符 2、3 和 4)。您可以处理它或在命令之前进行一些运算。