如何使用sed命令替换文件中的单词

How to use sed command to replace word in file

我有一个文本文件:

org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=localhost
org.jitsi.videobridge.xmpp.user.shard-1.DOMAIN=auth.jc.name.com
org.jitsi.videobridge.xmpp.user.shard-1.USERNAME=name
org.jitsi.videobridge.xmpp.user.shard-1.PASSWORD=Hfr*7462
org.jitsi.videobridge.xmpp.user.shard-1.MUC_JIDS=JvbBredjoy@internal.auth.jc.name.com
org.jitsi.videobridge.xmpp.user.shard-1.MUC_NICKNAME=7896aee5-fgre-4b02-4569-0bcc75ed1d0d

我创建了一个 bash 脚本:

#!/bin/bash
DPATH="/etc/jitsi/videobridge/sip-communicator.properties"
k=$(grep -o 'shard-1' $DPATH) # shard ends by a number#
i=$(grep -o 'shard-1' $DPATH | cut -c7)
m=$((i+1))
n="shard-$m"
sed -i "s|${k}|${n}|g" $DPATH

但是我得到错误:

/home/scripts# ./shard_number
./shard_number: line 5: 1
1
1
1
1
1: syntax error in expression (error token is "1
1
1
1
1")
sed: -e expression #1, char 9: unterminated `s' command

你能帮忙解决这个问题吗?谢谢。

如果您使用 bash -x /path/to/your/script 调用脚本或在脚本开头的某处添加 set -x(在 #!shebang 之后,但在您要调试的命令之前),您会看到您的 grep 命令 return 不是单个 'shard-1' 而是每行一个 'shard-1' :

++ grep -o shard-1 /etc/jitsi/videobridge/sip-communicator.properties
+ k='shard-1
shard-1
shard-1
shard-1
shard-1
shard-1'

一旦 cut,就会给出错误输出中提到的 1\n1\n1\n1\n1\n 字符串作为 $(( ... )) 表达式的无效标记,这也会破坏 [=] 的语法20=] 替换:

++ cut -c7
++ grep -o shard-1 /etc/jitsi/videobridge/sip-communicator.properties
+ i='1
1
1
1
1
1'

使该字符串成为一个数字(例如将您的 grep 输送到 sort -u 以统一化找到的所有碎片)并且您的脚本将正常工作:

#!/bin/bash
DPATH="/etc/jitsi/videobridge/sip-communicator.properties"
k=$(grep -o 'shard-1' $DPATH | sort -u) # shard ends by a number#
i=$(grep -o 'shard-1' $DPATH | sort -u | cut -c7)
m=$((i+1))
n="shard-$m"
sed -i "s|${k}|${n}|g" $DPATH

如果您想查看调试的初始脚本,可以try it here. Also check this test