使用Sed从文件的第三行获取第12个字符

时间:2016-12-09 22:48:31

标签: bash sed

我需要一种方法使用bash读取文本文件中第3行的第12个字符。有没有办法用sed做到这一点?

修改:查看所有答案,使用awkgawk的答案看起来更容易。但是,我不能让他们使用变量。我打字了 当gawk -F '' 'NR==3{print $VALUE}' file和文件的第3行放入$VALUE=12时,ABCDEFGHIJKLMNOPQRSTUVWXYZ只打印整行。我需要在任何地方加上引号或括号吗?

5 个答案:

答案 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