0

我目前正在尝试使用 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

(脚本有更多代码,但无关紧要)当我运行脚本时,如果我告诉它在 while 循环移动时输出 real_string/nc_string,则变量被正确输出,real_string/nc_string 变量实际上正在被定义正确,但我不确定为什么 sed 没有正确读取它们。如果有人能指出我做错了什么,我将不胜感激,因为我已经尝试了几个小时来解决这个问题,谢谢!

4

3 回答 3

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 讨厌:

for (( countc=1; countc <= ${#c[@]}; countc++ )); do
    IFS=';' read nc_string real_string <<< "${c[countc]}"
    # ...
done
于 2012-11-19T11:35:40.757 回答
2

我检查了“s/$nc_string/$real_string/gI”的回声,它正在正确扩展变量。请让我们知道,输入文件的内容。

我怀疑,下一行中突出显示的部分有一些问题。

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

如果要替换输入文件 ( phasef/${count}p.csv) 中的所有对并保存到输出文件 ( 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

注意-iin sed 行。

于 2012-11-19T08:34:01.293 回答
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
于 2012-11-19T08:22:28.130 回答