파일에서 찾아서 바꾸려고 합니다.
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"
첫째, 여전히 작업을 수행하려는 경우에는 with를 사용하지 마세요 sed
. -i
이것은 중요한 문서를 파기하는 방법 중 하나일 뿐입니다.
둘째, r
in은 파일을 읽는 명령 remote_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
먼저 해당 옵션 없이 시도해 보세요.