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

.その前に一つは持っていなければなりません*

正規表現として、後にゼロ個以上の等号が来ることをhostname=*意味します。hostnameしたがって 、sed "s/\<hostname=*\>/hostname=int1/"hostnamehostname=int1

対照的に、正規表現は後ろにゼロ個以上の文字が続くことを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

関連情報