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

逐个字符循环字符串。保留一个标志,告诉您是否在引号内。根据标志,如果需要,替换空格:

#! /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
$ echo $str | awk -F= '{sub(/ /,"+",$2);}1' OFS="="
1 2 3 var='foo+bar' 4 5 6

使用 awk,仅在第二个字段中用 + 替换空格(第二个字段恰好是用 = 分隔的表达式)。

于 2012-10-10T12:57:26.573 回答
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 回答