在 bash 脚本中,用多个字符替换字符串中的字符

In a bash script, replace character in string with multiple characters

我想替换“.”在此结果中:带有“点”的“172.16.0.25”。

这是我的代码:

#!/bin/bash    
connection=`netstat -tn | grep :1337 | awk '{print }' | cut -d: -f1`
#this returns "172.16.0.25"
replace=" dot "
final=${connection/./$replace}
echo "$final"

哪个returns:test.sh: 4: test.sh: Bad substitution

我尝试使用 tr '.' ' dot ' 但它只替换了 '.'用 space (' ')

我知道这是一个非常愚蠢的问题,但我是 Shell 脚本的新手。

此外,如果它有任何改变,我在 Raspberry Pi 2 运行 Raspbian.

connection=`netstat -tn | grep :1337 | awk '{print }' | cut -d: -f1 | sed 's/\./ dot /g'`

您甚至可以通过留在 awk:

来简化
connection=`netstat -tn | awk '/1337:/ && !x { split(, a, /:/); x = a[1]; gsub(/[.]/, " dot ", x); print x }'`

(我添加了 && !x 以确保只获取一行,以防万一。)

你可以单独使用 awk 做同样的事情:

netstat -tn | awk '/:1337/{sub(/:.*/,"",);gsub(/\./," dot ",);print }'

如果模式 :1337 匹配,则取 5th 字段。现在删除 :number 部分。同时将 . 替换为 dot 并打印该字段。

我觉得那行没问题(尽管它只会替换第一个点;使用 ${connection//./$replace} 替换所有点),所以最有可能的是你实际上并没有使用 bash.

bash 错误信息在 bad substitution 中有一个小写的 b 并且在行号之前放置了单词 line 。显示的错误消息看起来像是来自 /bin/sh.

如果你是运行脚本用命令

sh test.sh

那么系统将使用/bin/sh而不是/bin/bash

虽然@Amadan 的回答很准确,但我发布了一个变体(仅供爱好者使用),冒着投反对票的风险:)

connection=$(netstat -tn | grep :1337 | awk '{gsub("\.","dot", ); print }' | cut -d: -f1)

您可以简单地使用:

final="${connection//./$replace}"

示例:

#!/bin/bash
connection="172.16.0.25"
replace=" dot "
final="${connection//./$replace}"
echo "$final"

输出:

172 dot 16 dot 0 dot 25