sed 交換の問題

sed 交換の問題

私のファイルには次のものが含まれています。

$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

'貪欲'は、可能な限り長い文字列と一致することを意味します。

'怠惰' は、できるだけ短い文字列と一致することを意味します。

関連情報