정규식과 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-1271로 바꾸세요.XYZ-1225$BRANCH_NAME

답변1

주문 sed이 좀 혼란스럽네요.

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

첫째, 여전히 작업을 수행하려는 경우에는 with를 사용하지 마세요 sed. -i이것은 중요한 문서를 파기하는 방법 중 하나일 뿐입니다.

둘째, rin은 파일을 읽는 명령 remote_path입니다 . 나는 그것이 적어도 이라는 sed이름의 파일을 찾을 것이라고 확신합니다 . 두 경우 모두 파일이 존재하지 않으면 오류와 함께 종료되지 않습니다.emote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/gemote_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먼저 해당 옵션 없이 시도해 보세요.

관련 정보