0

我正在查看从第 7 行第 18 列开始的不同版本号的文件。

使用 Bash 从第 7 行(即“字符”)第 18 列到行尾读取(到 $ 变量中)字符串的最佳方法是什么?到该行的倒数第 5 个字符呢?

4

4 回答 4

1

sed方式:

variable=$(sed -n '7s/^.\{17\}//p' file)

编辑(感谢评论者):如果通过列表示字段(用制表符或空格分隔),则可以将命令更改为

variable=$(sed -n '7s/^\(\s\+\S\+\)\{17\}//p' file)
于 2012-06-12T17:42:49.397 回答
1

采用

var=$(head -n 17 filename | tail -n 1 | cut -f 18-)

或者

var=$(awk 'NR == 17' {delim = ""; for (i = 18; i <= NF; i++) {printf "%s%s", delim, $i; delim = OFS}; printf "\n"}')

如果您的意思是“字符”而不是“字段”:

var=$(head -n 17 filename | tail -n 1 | cut -c 18-)

或者

var=$(awk 'NR == 17' {print substr($0, 18)}')
于 2012-06-12T17:44:14.843 回答
1

根据您要使用的实用程序,您有多种不同的方法可以解决此问题。您的一个选择是通过以下任何一种方式使用 Bash 的子字符串扩展:

sed

line=1
string=$(sed -n "${line}p" /etc/passwd)
echo "${string:17}"

awk

line=1
string=$(awk "NR==${line} {print}; {next}" /etc/passwd)
echo "${string:17}"

核心工具

line=1
string=`{ head -n $line | tail -n1; } < /etc/passwd`
echo "${string:17}"
于 2012-06-12T17:48:21.830 回答
0

如果“列”是指“字段”:

a=$( awk 'NR==7{ print $18 }' file )

如果您真的想要第 7 行末尾的第 18 个字节,请执行以下操作:

a=$( sed -n 7p | cut -b 18- )
于 2012-06-12T17:41:13.437 回答