使用正则表达式和 sed 查找并替换

使用正则表达式和 sed 查找并替换

我正在尝试在文件中查找并替换:

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-1271XYZ-1225( $BRANCH_NAME)

答案1

你的sed命令有点混乱。

sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g"

首先,如果您仍在尝试让事情正常工作,请不要使用sedwith 。-i这只是销毁重要文件的一个秘诀。

其次,rinremote_pathsed读取文件的命令。我很确定它会查找一个名为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并先尝试不使用该选项

相关内容