我目前正在尝试使用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没有正确读取它们。如果有人能够指出我做错了什么我会非常感激,因为我现在已经想了几个小时,谢谢!
答案 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