1

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

4

2 回答 2

1

我认为你应该简化问题。不用担心空格,只需在=. 就像是:

sed -e 's/=/="/' -e 's/$/"/' test.dat | paste -s -d\  -

应该足够了。如果您真的关心空间,您可以尝试以下操作:

sed -e '/=.* /{ s/=/="/; s/$/"/; }' test.dat | paste -s -d\  -

那只会注意到=. / /如果你真的想改变任何地方有空格的行,就使用它。

无需使用while/read循环:只需让 sed 直接读取文件即可。

于 2013-01-15T13:47:05.670 回答
0

sed括号应该被转义:

ARGUMENT=`echo $ARGUMENT | sed "s/\^\(-D.*\)=\(.*\)/\1=\"\2\"/g"`

你做了一个地方,在 3 个地方你忘记了......顺便说一句,我通常使用"引用。

如果您更喜欢'-style,请这样做:

ARGUMENT=`echo $ARGUMENT | sed 's/\^(-D.*)=(.*)/\1="\2"/g'`
于 2013-01-15T13:50:07.880 回答