为什么不会正确读取这些变量?

时间:2012-11-19 06:29:02

标签: bash variables sed

我目前正在尝试使用sed来查找和替换文件中的某些文本,对于正在查找/替换的术语,我正在尝试使用变量,但由于某些原因我无法让它们正常工作。变量由c1-c9组成,如下所示:

    c1=$( echo "start time;project_start_time" )
    c2=$( echo "start_time;project_start_time" )
    c3=$( echo "end time;project_end_time" )
    c4=$( echo "end_time;project_end_time" )
    c5=$( echo "total time;project_total_time" )
    c6=$( echo "total_time;project_total_time" )
    c7=$( echo "project_id;project_ID" )
    c8=$( echo "status;project_status" )
    c9=$( echo "client_id;client_ID" )
    c10=$( echo "employee_id;employee_ID" )
    c11=$( echo "employee_name;employee_name" )
    c12=$( echo "date created;date_created" )
    c13=$( echo "date_created;date_created" )

包含sed部分的代码是:

 while [ "$countc" -le 13 ]; do
                    real_string=$( eval echo "\$c$countc" | cut -d ';' -f 2 )
                    nc_string=$( eval echo "\$c$countc" | cut -d ';' -f 1 )
                    sed -e "s/$nc_string/$real_string/gI" phasef/"$count"p.csv #> phasef/"$count".csv
                    countc=$(( $countc + 1 ))
            done

(脚本有更多的代码,但它是无关紧要的)当我运行脚本时,如果我告诉它输出real_string / nc_string,当while循环移动时,变量被正确输出,real_string / nc_string变量是实际上正确定义,但我不知道为什么sed没有正确读取它们。如果有人能够指出我做错了什么我会非常感激,因为我现在已经想了几个小时,谢谢!

3 个答案:

答案 0 :(得分:3)

我认为@anishsane可能有正确的答案。我只是想提供一些关于你的代码的说明。如果您正在使用bash,请利用bash的一些功能:

1)只需分配一个字符串而不是产生一个子shell来回显字符串:

c1="start time;project_start_time"

(除非echo只是一个占位符,用于更复杂的过程

2)使用数组而不是数字索引变量

c=(
     "start time;project_start_time"
     "start_time;project_start_time"
     "end time;project_end_time"
     "end_time;project_end_time"
     "total time;project_total_time"
     "total_time;project_total_time"
     "project_id;project_ID"
     "status;project_status"
     "client_id;client_ID"
     "employee_id;employee_ID"
     "employee_name;employee_name"
     "date created;date_created"
     "date_created;date_created" 
)

3)用read和IFS分割字符串并避免eval nastiness:

for (( countc=1; countc <= ${#c[@]}; countc++ )); do
    IFS=';' read nc_string real_string <<< "${c[countc]}"
    # ...
done

答案 1 :(得分:2)

我检查了回声“s / $ nc_string / $ real_string / gI”&amp;它正在适当地扩展变量。请告诉我们输入文件的内容。

我怀疑,下线的高位部分存在一些问题。

sed -e“s / $ nc_string / $ real_string / gI” phasef /“$ count”p.csv&gt; phasef / “$计数” 的.csv

如果要替换输入文件中的所有对(phasef/${count}p.csv)&amp;保存到输出文件(phasef/$count.csv),使用以下代码:

cp phasef/"$count"p.csv phasef/"$count".csv
while [ "$countc" -le 13 ]; do
    real_string=$( eval echo "\$c$countc" | cut -d ';' -f 2 )
    nc_string=$( eval echo "\$c$countc" | cut -d ';' -f 1 )
    sed -i -e "s/$nc_string/$real_string/gI"  phasef/"$count".csv
    countc=$(( $countc + 1 ))
done

请注意sed行中的-i

答案 2 :(得分:0)

你在sed行有一个拼写错误。变化

sed -e "s/$nc_string/$real_string/gI" phasef/"$count"p.csv

sed -e "s/$nc_string/$real_string/gI" phasef/"$countc"p.csv