sed: 와일드카드를 사용하여 문자열을 바꾸는 중에 문제가 발생했습니다.

sed: 와일드카드를 사용하여 문자열을 바꾸는 중에 문제가 발생했습니다.

다음을 사용하여 문자열을 바꾸려고합니다.

sed -e "s/\<$5\>/$6/g" "$2/$1" > "$4/$3"

$5-> "hostname=*"
$6-> "hostname=int1"
$2/$1-> "source file path"
$4/$3-> "destination file path" 

다음을 교체하려고 할 때 :

hostname=abc

알겠어요,

hostname=int1=abc

하지만 나는 원한다,

hostname=int1

이를 달성하기 위해 문자열을 어떻게 일치시킬 수 있습니까?

답변1

sed정규 표현식을 사용하세요. 이는 쉘("glob")에서 사용되는 패턴과 다릅니다.

다음은 작동하지 않습니다.

$ echo hostname=abc | sed "s/\<hostname=*\>/hostname=int1/"
hostname=int1=abc

그러나 다음은 수행됩니다.

$ echo hostname=abc | sed "s/\<hostname=.*\>/hostname=int1/"
hostname=int1

.그 전에 하나쯤은 갖고 있어야 합니다 *.

정규식으로, 뒤에 0개 이상의 등호가 오는 것을 hostname=*의미합니다 . hostname따라서 . sed "s/\<hostname=*\>/hostname=int1/"hostnamehostname=int1

대조적으로, 정규 표현식은 뒤에 0개 이상의 문자가 오는 것을 hostname=.*의미합니다 . hostname=그렇기 s/\<hostname=.*\>/hostname=int1/때문에 .hostname=abchostname=int1

답변2

이보다 더 나은 해결책이 있을 수 있지만 다음 명령을 사용할 수 있습니다.

sed /hostname.*$/s//"hostname=int1"/g /home/path/of/your/original/file > /tmp/hello.$$

cat /tmp/hello.$$ > /home/path/of/your/original/file

관련 정보