用sed读取特定行并声明为单独的变量

时间:2014-03-22 13:15:15

标签: bash sed

我有一个名为envisat_header的脚本,它读取特定文件并在屏幕上输出结果。我试图读取特定的行并将它们声明为字符串变量但是我想避免为每一行运行脚本:

#!/bin/sh
for i in $(find ~/ -name '*.N1'); do   
  declare orbitnr=$(envisat_header $i | sed -n -e '38p' | awk '{print $3}')
  declare dateimg=$(envisat_header $i | sed -n -e '39p' | awk '{print substr($3,2); }')
  declare FN_lat=$(envisat_header $i | sed -n -e '70p' | awk '{print $3}')
  declare FN_lon=$(envisat_header $i | sed -n -e '71p' | awk '{print $3}')
done

这显然意味着读取输出的第38,39,70和71行。实际上我想要一行(awk部分并不重要):

envisat_header $i | sed -n -e '38p;39p;70p;71p'

但问题是我不知道如何将这些行声明为单独的字符串变量。你能建议任何替代方案吗?

2 个答案:

答案 0 :(得分:3)

利用array

# assume that `arr` contains 4 words
arr=($(envisat_header $i | sed -n -e '38p;39p;70p;71p'))

w=${arr[0]}
x=${arr[1]}
y=${arr[2]}
z=${arr[3]}

答案 1 :(得分:2)

如果您对输入有控制权和/或信心,则可以使用eval。但是,如果输入可能包含shell代码(通过监督,或者因为某人想要伤害你),这是不安全的。

eval $(envisat_header "$i" |
    awk 'NR==38 { print "orbitnr=" $3 ";"}
        NR==39 { print "dateimg=" substr($3,2) ";"}
        NR==70 { print "FN_lat=" $3 ";"}
        NR==71 { print "FN_lon=" $3 ";"}')

Awk脚本的输出是一系列shell变量赋值。不使用eval运行它以查看生成的代码。

另请注意NR==...如何让您完全分解sed。通常,sed | awkuseless,最好用Awk编写。