我有一个这样的数组
echo ${arr[@]}
1 13 19 30 34
我想使用此数组从其他文件中sed行(1,13,19,30和34)。我知道我可以使用循环,但我想知道是否有更简单的方法来执行此操作。到目前为止,我还没能做到。
由于
答案 0 :(得分:2)
sed 解决方案:
a=(1 13 19 30 34)
sed -n "$(sed 's/[^[:space:]]*/&p;/g' <<< ${a[@]})" file
这将从file
答案 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[@]}
这可以对命令注射开放,因此可以相应地评估风险。