在bash中进行子字符串替换

6
今天我的问题是要替换字符串中的每个//,。我尝试了不同的命令,但都没有成功。其中一个命令是:finalString=${startingString//[//]/,}。另一个命令是:fileTemp=$(echo -e "$line\n" | tr "//" ",",但它会导致双重替换,例如:hello//world ---> hello,,world。请问有没有更好的方法来解决这个问题?
4个回答

3

您可以使用BASH字符串操作(需要用\/转义/):

s='6427//6422 6429//6423 6428//6421'
echo "${s//\/\//,}"
6427,6422 6429,6423 6428,6421

同样地,使用awk:
awk -F '//' -v OFS=, '{$1=$1}1' <<< "$s"
6427,6422 6429,6423 6428,6421

注意: 在这里不能使用tr,因为tr会将输入中的每个字符转换为输出中的另一个字符,在这里你要处理两个字符//


1
或者没有反斜杠:o=${s%%//*};while [[ $s != ${str#*//} ]] ;do o+=,${s%%//*}; s=${s#*//};done;o+="$s" - F. Hauri - Give Up GitHub

1
你可以使用 tr
echo "6427//6422 6429//6423 6428//6421" | tr -s '/' ','
6427,6422 6429,6423 6428,6421

注意添加了-s标志,它是--squeeze-repeats的别名:

将SET1中列出的每个重复字符序列替换为该字符的单个出现。


1
您可以使用sed作为:
$ echo "6427//6422 6429//6423 6428//6421" | sed 's#//#,#g'
6427,6422 6429,6423 6428,6421

1
您可以尝试像这样使用sed命令。
sed 's#/\{2,2\}#,#g'

找到双斜杠“//”,并用逗号“,”替换之。
例子:
echo "6427//6422 6429//6423 6428//6421"| sed 's#/\{2,2\}#,#g'

结果
6427,6422 6429,6423 6428,6421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接