sedと複数の区切り文字を使用して2つの単語を置き換える方法は?

sedと複数の区切り文字を使用して2つの単語を置き換える方法は?

単語には文字のみが許可され、他の文字は区切り文字です。最初の単語を3番目の単語に置き換えたいです。

sed -E 's/([A-Za-z]+) [^A-Za-z] ([A-Za-z]+) [^A-Za-z] ([A-Za-z]+)/\3 \2 \1/' filename

このように書いたのですが、うまくいきません。

例:

I 4want5to%change

この文字列を次に変更したいと思います。

to 4want5I%change

どんなアイデアがありますか?

ベストアンサー1

[[:alpha:]]大文字と小文字を一致させるには文字クラスを使用し、[^[:alpha:]]他のすべての文字を一致させるには否定を使用します。

sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' file.txt

例:

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'I 4want5to%change'
to 4want5I%change

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'4I 4want5to%change'
4to 4want5I%change

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'Spring&summer^winter'
winter&summer^Spring

おすすめ記事