1

私はシェルスクリプトが初めてです。引数を含むファイルを 1 行ずつ読み取りたいのですが、引数にスペースが含まれている場合は、引用符で囲んで置き換えたいと考えています。

たとえば、ファイル (test.dat) に含まれている場合、

-DtestArgument1=/path/to a/text file
-DtestArgument2=/path/to a/text file

上記のファイルを解析した後、シェルスクリプトは次の文字列を準備する必要があります

-DtestArgument1="/path/to a/text file" -DtestArgument2="/path/to a/text file"

これが私のシェルスクリプトです。

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 \)

コードはすべてのシェルと互換性がある必要があります。私を助けてください。前もって感謝します。

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"`

あなたがした1つの場所、あなたが忘れた3つの場所で... ところで、私は一般的に"引用を使用します.

'スタイルを好む場合は、次のようにします。

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