将bash循环迭代输出到下一次迭代中

时间:2017-10-17 20:44:46

标签: bash

我有一个我想用sed执行的替换列表。我没有将替换组合成单个sed命令,而是希望在bash循环的迭代中执行每个替换。例如:

cat ${input} |
for subst in "${substlist}"; do
    sed 's/'${subst}'/modified_'${subst}'/g'
done > ${output}

我希望每次迭代都会修改整个流,但我只看到第一次迭代得到输入。

这种模式在bash中是否可行?

3 个答案:

答案 0 :(得分:1)

创建一个-e选项数组,以传递给sed

filters=()
for subst in ${substlist}; do
    filters+=(-e "s/$subst/modified_$subst/")
done
sed "${filters[@]}" "$input" > "$output"

(迭代不带引号的参数扩展并动态创建每个sed过滤器的问题超出了本答案的范围。)

答案 1 :(得分:0)

以下是将其作为单个流进行操作的一种方法。从pthread_create建立sed参数并调用sed一次:

${substlist}

根据#!/bin/sh cat ${input} | sed `for subst in ${substlist}; do echo " -e s/${subst}/modified_${subst}/g " done` > ${output} 中的内容,您可能需要进行额外的转义。

答案 2 :(得分:-1)

将输入文件复制到输出文件,然后使用sed选项执行-i替换以覆盖该文件。

cp "$input" "$output"
for subst in $substlist
do
    sed -i "s/$subst/modified_$subst/g" "$output"
done

需要BSD / OSX sed

sed -i '' "s/$subst/modified_$subst/g" "$output"