首页 > 解决方案 > 如何使用 sed 命令替换文件中的单词

问题描述

我有一个文本文件:

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

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

标签: bashsed

解决方案


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

++ 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错误输出中提到的字符串作为$(( ... ))表达式的无效标记,这也破坏了您的sed替换语法:

++ 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

你可以在这里试试。如果您想查看已调试的初始脚本,还请检查此测试。


推荐阅读