1

私はこの文字列を持っています:

str='1 2 3 var="foo bar" 4 5 6'

また、次のようになります。

str="1 2 3 var='foo bar' 4 5 6"

+スペースを引用符 (ダブルまたはシングル) 内のみに置き換えるにはどうすればよいですか?

結果は次のようになります。

1 2 3 var="foo+bar" 4 5 6

また

1 2 3 var='foo+bar' 4 5 6

var が一重引用符で囲まれている場合。

var強い一致ではありません。また、次のように、まったく欠落している可能性があります。

str='1 2 3 "foo bar" 4 5 6'

これを行うために awk、sed、または perl を使用したくありません。

4

3 に答える 3

3

文字列を 1 文字ずつループします。引用符で囲まれているかどうかを示すフラグを保持します。フラグに基づいて、必要に応じてスペースを置き換えます。

#! /bin/bash
str='1 2 3 var="foo bar" 4 5 6'

result=''
inside=0
for (( i=0 ; i<${#str} ; i++ )) ; do
    char=${str:i:1}
    if [[ $char == [\"\'] ]] ; then
        let inside=!inside
    fi
    (( inside )) && char=${char/ /+}
    result+=$char
done
echo $result
于 2012-10-10T13:03:13.650 に答える
0

これは、文字列を反復処理するために別の手法を使用するだけで、choroba の回答と同じです。

#!/bin/bash

str='1 2 3 var="foo bar" 4 5 6'
result=''
declare -i inside=0
while IFS= read -n1 char; do
    [[ $char = [\"\'] ]] && inside=!inside
    (( inside )) && char=${char/ /+}
    result+=$char
done <<< "$str"
echo "$result"
于 2012-10-10T13:36:19.360 に答える
0
$ echo $str | awk -F= '{sub(/ /,"+",$2);}1' OFS="="
1 2 3 var='foo+bar' 4 5 6

awk を使用して、2 番目のフィールドのみ、スペースを + に置き換えます (2 番目のフィールドは、= で区切られた場合、たまたま式になります)。

于 2012-10-10T12:57:26.573 に答える