我目前在多个字符上出现sed
错误
sed: -e expression #1, char 37: unterminated `s' command
我的sed输入看起来像这个
s/EMAIL/pcorn@abc.net/;s/FULLNAME/Pop Corn/;s/TITLE/Col./;s/NAME/Corn/;s/AMOUNT/200/
s/EMAIL/pennyl@xyz.net/;s/FULLNAME/Penny Loafer/;s/TITLE/Miss/;s/NAME/Loafer/;s/AMOUNT/300/
s/EMAIL/butter@xyz.net/;s/FULLNAME/Melba Toast/;s/TITLE/Ms./;s/NAME/Toast/;s/AMOUNT/250/
s/EMAIL/bobhead@abc.com/;s/FULLNAME/Bob L Head/;s/TITLE/Mr./;s/NAME/Head/;s/AMOUNT/990/
从此文件读取的每一行都是单独的sed
命令。
template="template.txt"
details="p4Customer.txt"
count=1
filename="customer${count}.txt"
gawk -f g1.awk $details | while read detail; #outputs the file above and pipes into while loop
do
sed -E $detail $template > "$directory/$filename";
count=$(($count+1))
done;
我确保使用了所有3 /
和;
。我似乎无法弄清楚出了什么问题,也许我已经看了太久了。
答案 0 :(得分:3)
您还没有对引用的变量引用进行双重引用。如果没有双引号,shell会将变量的值拆分为" words" (然后尝试展开它在任何单词中找到的任何文件通配符)。由于您的sed
命令包含空格,因此它们会被拆分为多个单词,这会使sed
完全混淆。
具体来说,detail
设置为" s / EMAIL/pcorn@abc.net/; s / FULLNAME / Pop Corn /; s / TITLE / Col ./; s / NAME / Corn / ; s / AMOUNT / 200 /",命令sed -E $detail $template
相当于:
sed -E 's/EMAIL/pcorn@abc.net/;s/FULLNAME/Pop' 'Corn/;s/TITLE/Col./;s/NAME/Corn/;s/AMOUNT/200/' template.txt
所以sed
尝试对名为" Corn /; s / TITLE / Col ./; s / NAME / Corn /; s / AMOUNT / 200 /&#的文件执行s/EMAIL/pcorn@abc.net/;s/FULLNAME/Pop
34;和" template.txt"。
解决方案:双引号变量:
sed -E "$detail" "$template" > "$directory/$filename"
顺便说一句,你也不需要行尾的;
。另外,我建议shellcheck.net发现像这样的基本问题。
脚本中也存在逻辑问题。您每次循环都会增加count
,但不要更新filename
。因此,它将输出到" customer1.txt"每次都通过循环。您需要每次更新filename
,或者只是在重定向中包含模式(包括$count
)。