sed -e未定's'命令

时间:2017-10-04 01:31:26

标签: bash awk sed

我目前在多个字符上出现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 /;。我似乎无法弄清楚出了什么问题,也许我已经看了太久了。

1 个答案:

答案 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)。