sed を使用した特定のパターン間の置換

sed を使用した特定のパターン間の置換

sed朝はインターネット検索をしてみましたが、うまく動作しないようです。

sedで可能ですか?小文字2つの特定の文字間のテキスト:

つまり

SOMENAME=WOODSTOCK,
SOMEOTHERNAME=JIMMY,

できますか?小文字 WOODSTOCKそしてJIMMY=(ウッドストックとジミに)彼らはと,

答え1

GNU sedはこれを達成できます。交換がどれほど欲しいかに応じて、これら2つの形式のいずれかを選択してください。

sed 's|=.*,|\L&|' file
sed 's|=[^,]*,|\L&|' file

マニュアルに記載されているように, " or が見つかる\Lまで置換内容を小文字に変換します。"\U正規表現に一致するテキストです。\E&


=.*,貪欲な正規表現と貪欲な正規表現の間で賢明に=[^,]*,選択する必要があることを示すために、サンプルファイルを修正しました。

$ cat file
SOMENAME=WOODSTOCK,
SOMEOTHERNAME2=JIMMY,WOODSTOCK,FINISH
$ sed 's|=.*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,woodstock,FINISH
$ sed 's|=[^,]*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,WOODSTOCK,FINISH

答え2

すべてのPOSIX互換プラットフォームでこの機能をawk使用できます。tolower()

awk -v FS='=' 'BEGIN { OFS = FS } { $2 = tolower($2) }1 ' file

このmktemp()機能を使用して、上記のコマンドの出力をリダイレクトする一時ファイルを作成し、再度リダイレクトして保存します。またはGNU awk> = 4.1を使用してください。-i inplace

POSIX互換バージョンの別のバリエーションは、match()次の関数を使用して実行できます。

awk 'match($0, /=([^,]*),/) { str = substr($0, RSTART+1, RLENGTH-2); sub(str, tolower(str)) }1'

関連情報