sed를 사용하여 문자열의 일부 바꾸기

sed를 사용하여 문자열의 일부 바꾸기

파일의 특정 문자열을 바꿀 계획입니다. 그래서 sed를 사용하고 있습니다.

문자열을 교체하고 싶습니다. 대신 sed가 문자열을 읽고 문자열 중간에 텍스트를 추가합니다.

예:

string in myfile : user=blabla
string that I want to obtain: user=bob

그래서 저는 sed를 이런 식으로 실행하여 "user=" 문자열을 검색하고 "user=bob"으로 바꾸도록 했습니다.

sed -i 's/user=*/user=bob/' myfile

내가 얻는 것은

user=bobblabla

기본적으로 sed는 해당 부분만 교체하고 전체 문자열을 새 문자열로 교체하고 싶다고 생각합니다. 나는 *가 sed에게 이후의 모든 것을 고려하라고 지시할 것이라고 생각했지만 작동하지 않습니다.

"blabla"가 무엇인지 모르기 때문에 sed 명령에 넣을 수 없습니다. "user="로 시작하는 문자열을 찾고 전체 문자열을 새 문자열로 바꾸도록 sed에게 어떻게 지시합니까?

답변1

쉘 패턴과 정규식을 혼동하고 있는 것 같습니다. 쉘 패턴에서 는 *0개 이상의 문자를 의미합니다. sed패턴에서 예상되는 정규식에서는 *0개 이상의 이전 원자를 의미합니다. 귀하의 예에서 해당 원자는 =. 따라서 0 이상이 뒤따르는 sed를 검색 하고 일치하는 문자열을 . 원하는 패턴은 이며 , 그 뒤에 문자( )가 0번 이상 옵니다. 다음 명령을 수행합니다.user=user=bobuser=.*user=.sed

sed -i 's/user=.*/user=bob/' myfile

답변2

GaryJohn이 말했듯이 정규식이 잘못되었습니다. (* -> .*)

하지만 당신이 거기 있는 동안 나는 조금 더 나아갈 것입니다... 당신의 파일이 실제로 어떤 것인지는 모르지만 연습을 위해 검색/바꾸기 작업을 좀 더 안전하게 만드는 방법을 살펴볼 것입니다.

다음과 같은 파일을 통해 실행하고 싶다고 가정해 보겠습니다.

user=john
superuser=jimmy      # don't want to change this line!
user=L33t_us3rn4m3   # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello

현재 sed 구문을 사용하면 이는 상당히 잘못될 수 있습니다. 좀 더 구체적으로 설명하려면 다음을 시도해 보세요.

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile

이는 다음을 수행합니다.

  • 행이 실제로 "user"(^)로 시작하는 경우에만 트리거됩니다.
  • 0개 이상의 문자, 숫자 또는 밑줄로 구성된 "user="만 변경하세요.
  • 사용자 이름 뒤의 모든 내용(예: 내 예의 주석)은 그대로 둡니다.

이것은 결코 사용자 이름을 바꾸려는 곳 어디에서나 항상 작동하는 매우 안전한 것이 아닙니다. 분명히 이는 구성 파일 설정 방법과 예상되는 내용에 따라 다릅니다. 그러나 내 대답은 약간의 "생각할 거리"를 제공하기 위한 것입니다. 너무 많은 사용자 이름이 이 작업을 수동으로 수행하고 싶지 않을 만큼 충분히 큰 구성 파일이 주어지면 맹목적으로 "user=.*를 대체하기 때문입니다. "아마 위험할 것 같아. 이러한 종류의 작업을 다듬는 데 시간을 할애할 수도 있습니다. :)

행운을 빌어요.

관련 정보