我在Shell脚本中遇到“sed”命令问题,
我有以下脚本尝试将3个“标签”替换为我从其他2个文件中捕获的信息:
#!/bin/sh
VAR1=$(cat file1.sh | grep --max-count=1 DLC=)
VAR2=$(cat file1.sh | grep --max-count=1 PROPATH=)
VAR3=$(cat file2.sh | grep -e - )
sed 's|PATTERN1|'"$VAR1"'|' < Template.sh > temp1.sh
sed 's|PATTERN2|'"$VAR2"'|' < temp1.sh > temp2.sh
sed 's|PROGRESS_CONNECTION|'"$VAR3"'|' < temp2.sh > Final.sh
请注意,3个变量的内容是字符串(不带双引号):
VAR1="DLC=/user/aaa/bbb;export DLC"
VAR2="PROPATH=/user/ccc/ddd;export PROPATH"
VAR3="-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork
-db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm
-db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp
-yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000
-cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA"
当我运行此脚本时,正确创建了temp1.sh,正确创建了temp2.sh,但是没有创建Final.sh,我收到一条sed错误消息:
sed: -e expression #1, char 91: unterminated `s' command
此时我不确定导致问题的原因。
任何帮助?
答案 0 :(得分:1)
问题是您的$VAR3
变量确实包含一些换行符。
$ echo "$VAR3"
-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork
-db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm
-db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp
-yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000
-cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA
s///
不能包含换行符(除非前面有\
)。解决方案是使用tr -d '\n'
删除换行符:
$ echo "$VAR3" | tr -d '\n'
-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork -db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm -db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp -yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000 -cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA
现在在sed中使用它:
$ sed 's|PAT|'"$(echo $VAR3 | tr -d '\n')"'|' temp2.sh > Final.sh