来自行号的Sed文件存储在数组中

时间:2017-08-25 08:52:29

标签: bash awk sed

我有一个这样的数组

echo ${arr[@]}
1 13 19 30 34 

我想使用此数组从其他文件中sed行(1,13,19,30和34)。我知道我可以使用循环,但我想知道是否有更简单的方法来执行此操作。到目前为止,我还没能做到。

由于

4 个答案:

答案 0 :(得分:2)

sed 解决方案:

a=(1 13 19 30 34)
sed -n "$(sed 's/[^[:space:]]*/&p;/g' <<< ${a[@]})" file

这将从file

中提取1,13,19,30和34行

答案 1 :(得分:2)

您可以在每一行上执行单个 sed 命令,方法是将命令和分号附加到每一行,然后将结果作为sed程序运行。这可以使用变量和数组中的bash模式替换以紧凑的方式进行管理;例如,要打印选定的行,请使用p命令(-n禁止打印未选择的行):

sed -n "${arr[*]/%/p;}"

也可以使用更复杂的命令,例如s/from/to/

sed "${arr[*]/%/s/from/to/;}"

这将仅在选定的行上执行替换。

答案 2 :(得分:1)

awk -v rows="${arr[*]}" 'BEGIN{split(rows,tmp); for (i in tmp) nrs[tmp[i]]} NR in nrs' file

答案 3 :(得分:-1)

您可以使用awk和系统函数来运行sed命令

awk '{ for (i=1;i<=NF;i++) { system("sed -n \""$i"p\" filename") } }' <<< ${arr[@]}

这可以对命令注射开放,因此可以相应地评估风险。