我有一个非常庞大的文件,需要在一些巨大的行中间查看几个字符。
是否可以在某个文件中轻松显示行号n1
中n2
位置到l
位置的字符?
我认为应该有一些方法可以用sed
来做,只是找不到相应的选项。
答案 0 :(得分:4)
您最好使用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
来阻止该行的默认打印。
答案 1 :(得分:3)
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}'
在这两种情况下,它都会在相关行之后退出,以避免处理文件的其余部分。
答案 2 :(得分:0)
仅使用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)。您可以在命令之前处理它或进行一些算术运算。