在 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
我想替换“.”在此结果中:带有“点”的“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