我有一个我想用sed
执行的替换列表。我没有将替换组合成单个sed
命令,而是希望在bash循环的迭代中执行每个替换。例如:
cat ${input} |
for subst in "${substlist}"; do
sed 's/'${subst}'/modified_'${subst}'/g'
done > ${output}
我希望每次迭代都会修改整个流,但我只看到第一次迭代得到输入。
这种模式在bash中是否可行?
答案 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"