들여쓰기가 있는 파일이 있습니다.
특정 줄을 바꾸고 싶지만 들여쓰기를 유지하고 싶습니다.
파일에는 다음과 같은 줄이 있습니다.
\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