我需要一种方法使用bash读取文本文件中第3行的第12个字符。有没有办法用sed做到这一点?
修改:查看所有答案,使用awk
或gawk
的答案看起来更容易。但是,我不能让他们使用变量。我打字了
当gawk -F '' 'NR==3{print $VALUE}' file
和文件的第3行放入$VALUE=12
时,ABCDEFGHIJKLMNOPQRSTUVWXYZ
只打印整行。我需要在任何地方加上引号或括号吗?
答案 0 :(得分:3)
注意:本答案中的两个解决方案都不支持多字节字符。只有ASCII。
使用GNU awk非常简单:
gawk -F '' 'NR==3{print $12}' file
将字段分隔符设置为空字符会将输入行拆分为字符。
使用sed
,它可能如下所示:
sed -n '3{s/.\{11\}//;s/\(.\).*/\1/p}' file
首先使用s/.\{11\}//
删除前11个字符,然后保留第12个字符,并使用s/\(.\).*/\1/
删除其后面的所有内容。 p
打印剩余的第12个字符。你看,awk
解决方案更简单。 ;)
PS:上述sed
解决方案可以简化为Jonathan Leffler显示。
答案 1 :(得分:3)
sed -n '3 s/^.\{11\}\(.\).*/\1/p' text.file
-n
表示默认不打印'。在第3行,匹配11个字符,捕获1(第12个),匹配其余部分,替换为捕获的字符,打印。如果您愿意,可以在第3行之后退出:
sed -n '3 {s/^.\{11\}\(.\).*/\1/p;q;}' text.file
这样,sed
不会浪费时间阅读并忽略文件的其余部分。
而且,如果你喜欢扭曲编程,你可以使用:
sed -n '3 {s/^\(\(.\)\{12\}\).*/\2/p;q;}' text.file
这样做的好处是12出现在命令行中,所以如果你改变主意并想要15或9而不是12,你可以直接改变它 - 事实上,小心它可能是一个shell参数您用来保存号码,并且您不必减去1'在使用之前,或特殊情况1.它是如何工作的?有两个嵌套的捕获;外部长度为12个字符,但内部长度只有一个字符,因为它会重复,只有最后一个匹配计算到替换操作 - 因此替换中的\2
提供了第12个字符
答案 2 :(得分:1)
可以管道切割:
sed用于提取线,而cut用于提取字符:
sed -n '3{p;q}' | cut -c 12
答案 3 :(得分:1)
另外三个awk
解决方案,前两个解决方案是gawk
特定的。
$ gawk 'BEGIN{FIELDWIDTHS="11 1"} NR==3{print $2}'
$ gawk 'NR==3{print gensub(/^.{11}(.).*/,"\\1",1)}'
这应该适用于ASCII字符集的所有awk
,如下所示
$ awk 'NR==3{print substr($0,12,1)}'
答案 4 :(得分:0)
sed '3!d; /^...........\(.\).*/ s::\1:' FILE