sedが出力-e式#1、文字55を出力する理由:古い正規表現が無効です。

sedが出力-e式#1、文字55を出力する理由:古い正規表現が無効です。

コンマで区切られた文字列でkey = valueを見つけて置き換えるsedコマンドを作成しようとしています。

ファイルの文字列の例: KEY_1=value_1,KEY_2=value_2,SOMEKEY=lastValue

使用されたsedコマンド:

sed -r 's/KEY_2=.*?((?=,)|$)/KEY_2=new_value/' myFile.txt

キーが存在する場合は、キーとその値を新しいkey = valueに置き換えます。ほとんどの値はコンマ "," で終わりますが、文字列の最後の key=value には、がないことは例外です。

RedHat Linux VM では、次のエラーメッセージが表示されます。

sed: -e 式 #1, char 55: 前の正規表現が無効です。

私はこれが/ gで試した最後の「/」だと思います。これは、元の文字列でキーを繰り返すべきではないため、除外可能です。

ベストアンサー1

このsedユーティリティはPerlと同様の正規表現をサポートしません。

代わりに、次のものを使用できます。

$ sed 's/KEY_2=[^,]*/KEY_2=new value/' file
KEY_1=value_1,KEY_2=new value,SOMEKEY=lastValue

または

$ sed 's/\(KEY_2\)=[^,]*/\1=new value/' file
KEY_1=value_1,KEY_2=new value,SOMEKEY=lastValue

または、次のようにawk (正規表現を使用せずにキーと正確な文字列一致を使用すると、および両方がKEY_2あるときに混乱を防ぐことができますSOME_OTHER_KEY_2):

$ awk -F, -v OFS=, '{ for (i = 1; i <= NF; ++i)
                          if (split($i, a, "=") == 2 && a[1] == "KEY_2") {
                              $i = "KEY_2=new value"
                              break
                          } } 1' file
KEY_1=value_1,KEY_2=new value,SOMEKEY=lastValue

おすすめ記事