我正在尝试在文件中查找并替换:
echo "$BRANCH_NAME" >> "$WORKING_DIR"/test.text
sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g" "$WORKING_DIR"/sftp-config.json
...脚本成功创建test.text
并打印了BRANCH_NAME
所以我知道它到目前为止工作良好。但是我无法进行查找和替换工作。
如果您想知道,正则表达式输出是:
Full match `remote_path": "/home/myname/public_html/ABC-1271`
Group 1. `ABC-1271`
简而言之,这就是我想要实现的目标:
查找ABC-1271
于细绳 remote_path": "/home/myname/public_html/ABC-1271
的文件 sftp-config.json
并替换ABC-1271
为XYZ-1225
( $BRANCH_NAME
)
答案1
你的sed
命令有点混乱。
sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g"
首先,如果您仍在尝试让事情正常工作,请不要使用sed
with 。-i
这只是销毁重要文件的一个秘诀。
其次,r
inremote_path
是sed
读取文件的命令。我很确定它会查找一个名为emote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g
或至少emote_paths
.在任何一种情况下,如果文件不存在,它都不会因错误而退出。
看起来你想要类似的东西
s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g
命令变为
sed "s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
或者,如果分支名称是该行中最后一个名称之后的最后一个名称/
,并且该字符串remote_path
唯一地定位该行:
sed "/remote_path/s#/[^/]*\$#$BRANCH_NAME#" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
不过,理想情况下,您可以使用 JSON 感知工具来执行此操作,例如jq
:
jq ".remote_path = (.remote_path | split(\"/\") | .[-1] = \"$BRANCH_NAME\" | join(\"/\"))" \
input.json >output.json
答案2
(1)remote_path
似乎是一个地址,用该模式过滤行?然后用斜线包围它:/remote_path/
(2) 您似乎为整行创建了一个表达式,但只想替换您用 标记的部分()
。正确的?但它们的使用方式非常不同(分组或反向引用),您需要转义它们\(\)
或使用-E
扩展正则表达式的选项
(3) 找到一个仅匹配要替换的分支名称的模式,例如大写字母和数字之间的破折号:[A-Z]*-[0-9]*
我们最终得到
sed -i '' "/remote_path/s/[A-Z]*-[0-9]*)/$BRANCH_NAME/g" "$WORKING_DIR"/sftp-config.json
-i
并先尝试不使用该选项