我是shell脚本的新手。我想逐行读取一个文件,其中包含参数,如果参数中包含任何空格,我想用引号括起来替换它。
例如,如果文件(test.dat)包含,
-DtestArgument1=/path/to a/text file
-DtestArgument2=/path/to a/text file
解析上述文件后,shell脚本应该使用以下
准备字符串-DtestArgument1="/path/to a/text file" -DtestArgument2="/path/to a/text file"
这是我的shell脚本,
while read ARGUMENT; do
ARGUMENT=`echo ${ARGUMENT} | tr "\n" " "`
if [[ "${ARGUMENT}" =~ " " ]]; then
ARGUMENT=`echo $ARGUMENT | sed 's/\^(-D.*\)=(.*)/\1=\"\2\"/g'`
NEW_ARGUMENT="${NEW_ARGUMENT} ${ARGUMENT}"
else
echo "doesn't contains spaces"
NEW_ARGUMENT="${NEW_ARGUMENT} ${ARGUMENT}"
fi
done < test.dat
但它抛出以下错误:
sed: -e expression #1, char 28: Unmatched ) or \)
代码应与所有shell兼容。请帮帮我。提前谢谢。
答案 0 :(得分:1)
我认为你应该简化这个问题。而不是担心空格,只需在=
之后引用该参数。类似的东西:
sed -e 's/=/="/' -e 's/$/"/' test.dat | paste -s -d\ -
应该足够了。如果你真的关心空间,你可以尝试类似的东西:
sed -e '/=.* /{ s/=/="/; s/$/"/; }' test.dat | paste -s -d\ -
这只会注意=
之后的空格。如果您真的想要更改任何地方有空格的行,请使用/ /
。
不需要使用while/read
循环:只需让sed直接读取文件。
答案 1 :(得分:0)
应转义sed
个括号:
ARGUMENT=`echo $ARGUMENT | sed "s/\^\(-D.*\)=\(.*\)/\1=\"\2\"/g"`
你做过的一个地方,在3个地方你忘记了......顺便说一句,我通常使用"
引用。
如果您更喜欢'
- 样式,请执行以下操作:
ARGUMENT=`echo $ARGUMENT | sed 's/\^(-D.*)=(.*)/\1="\2"/g'`