특정 라인을 교체하고 아이덴티티를 유지하세요

특정 라인을 교체하고 아이덴티티를 유지하세요

들여쓰기가 있는 파일이 있습니다.
특정 줄을 바꾸고 싶지만 들여쓰기를 유지하고 싶습니다.
파일에는 다음과 같은 줄이 있습니다.

   \t\t     customerId = "123" // has indentation in the start of line

나는 이것을 실행하고 있습니다 :

sed  -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file

이것은 효과가 없습니다. 나는 또한 그것이 작동하더라도 들여쓰기를 엉망으로 만들 것이라는 것을 알고 있습니다. 이 문제를 어떻게 해결할 수 있나요?
노트:해결책은 반드시 그럴 필요는 없지만 sed크로스 플랫폼이기를 바랍니다.

고쳐 쓰다
@Gilles Quenot의 답변을 테스트했습니다.

OLD_ID="1234"  
NEW_ID="5678"  
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":"   testfile   

테스트 샘플:

name="Jim"
    customerId = "1234"

번호가 변경되지 않았습니다.

답변1

사용 표준 sed:

sed "s:^\([[:blank:]]*customerId = \)\"$OLDID\":\1\"$NEWID\":" file

[:blank:]패턴은 단일 공백 ​​또는 탭 문자와 일치합니다.

sed표현식은 ID 이전의 모든 내용을 캡처하고 이를 캡처된 콘텐츠와 새 ID로 바꿉니다.

어쩌면 그 사람이 더 좋아 보일지도 몰라

sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file

시험:

$ cat file
name="Jim"
    customerId = "1234"

$ OLDID=1234
$ NEWID=321

$ sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file
name="Jim"
    customerId = "321"

주변 공간이 =선택 사항인 경우 다음을 사용할 수 있습니다.

sed 's:^\([[:blank:]]*customerId *= *\)"'"$OLDID"'":\1"'"$NEWID"'":' file

의견에서 don_crissti가 제안한 또 다른 접근 방식은 다음과 같습니다.

sed '/customerId *=/s/"'"$OLDID"'"/"'"$NEWID"'"/' file

이것의 장점은 캡처링 그룹이 필요하지 않다는 것입니다. 이렇게 하면 등호 뒤에 단어가 포함된 줄을 찾아 customerId해당 줄의 ID를 바꿉니다.

답변2

sed -E "s:^(\s*)customerId = \"$OLD_ID\":\1customerId = \"$NEW_ID\":" file

관련 정보