Shell脚本用于查找带空格的字符串并用引号括起来

时间:2013-01-15 13:41:46

标签: shell unix

我是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兼容。请帮帮我。提前谢谢。

2 个答案:

答案 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'`