web-dev-qa-db-ja.com

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

文字列を一致させるにはどうすればよいですか?

2
Menon

sedは正規表現を使用します。これらは、シェルが使用するパターン(「グロブ」)とは異なります。

以下は機能しないことに注意してください。

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

ただし、次のことは行います。

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

.の前に*が必要です。

正規表現としてhostname=*hostnameの後に0個以上の等号が続くことを意味します。したがって、sed "s/\<hostname=*\>/hostname=int1/"hostnamehostname=int1に置き換えます。

対照的に、正規表現hostname=.*は、hostname=の後に0個以上の任意の文字が続くことを意味します。そのため、s/\<hostname=.*\>/hostname=int1/hostname=abchostname=int1に置き換えます。

4
John1024

これよりも良い解決策があるかもしれませんが、以下のコマンドを使用できます。

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

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

1
Thushi