bash - 如何使用 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
你能帮忙解决这个问题吗?谢谢你。
解决方案
如果您在脚本开头(在 之后,但在要调试的命令之前)调用脚本bash -x /path/to/your/script
或添加脚本,您将看到您的命令返回的不是单个 'shard-1' 而是一个 'shard-每行 1':set -x
#!shebang
grep
++ 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
推荐阅读
- python - 想要从 csv 文件创建键值对列表但无法
- flutter - 在颤动中第一次加载时图像闪烁
- javascript - Three.js 和 Perlin.js 地形生成问题
- python - 如何通过 Python 中的用户交互来执行存储在字典中的函数?
- python - 尝试将两个`float`相乘时出现Python错误
- javascript - 如何在 javascript 中使用 ajax 向服务器发送响应(从单选按钮接收)?
- python - Python 快速文本文本分类
- swift - 在范围内找不到“DatabaseError”
- tensorflow - TensorFlow 错误消息:AlreadyExistsError:另一个同名指标已存在
- python - Python trimesh x 横截面会产生奇怪的结果