私のファイルには次のものが含まれています。
$Param_T=ABC49_SA_T2
$Param_V=ABC49BC_SA_V2
$Param_ST=ABC491_SA_M2
ABC * _で始まる値をXYZ12_に置き換えようとしています。
sed -i 's/ABC\.*_/XYZ12_/g' INCR.parm
上記は私が使用したsedコマンドです。エラーは発生しませんでしたが、値は変更されませんでした。誰でもこの問題を解決するのに役立ちますか?
答え1
sed を使用して貪欲でない一致を達成する方法は、文字セットを指定することです。いいえ一致させたい項目:
sed -i 's/=ABC[^_]*_/=XYZ12_/g' INCR.parm
つまり、「ABC」の後にアンダースコアではなく、ゼロ個以上の文字とアンダースコアが続くものと一致します。
この時点から出ることはできません。 「ネイキッド」ドットは「すべての文字と一致」を意味し、エスケープドットは「リテラルドットと一致」を意味します。リテラル文字列「ABC」に一致するデータがないため、置換は行われませんでした。
答え2
.
すべての文字に一致する「」をエスケープしないでください。貪欲]
sed -i 's/ABC.*_/XYZ12_/g' INCR.parm
出力:
$Param_T=XYZ12_T2
$Param_V=XYZ12_V2
$Param_ST=XYZ12_M2)
最初のアンダースコア()[lazy]までのみABC *を置き換えるには、_
perl regexを使用する必要があります。
使用
perl -pe 's/ABC(.*?)_/XYZ12_/g' INCR.parm
出力:
$Param_T=XYZ12_SA_T2
$Param_V=XYZ12_SA_V2
$Param_ST=XYZ12_T2
'貪欲'は、可能な限り長い文字列と一致することを意味します。
'怠惰' は、できるだけ短い文字列と一致することを意味します。