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

答え2

スペースを削除し、逆参照を修正して区切り文字を維持します。また、区切り記号 ""があるため、<space>4複数の「区切り記号」文字を連続して区切り記号として許可する必要があります。

行の先頭にあることを指定する必要があります。

だから代わりに:

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

使用:

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

答え3

まだsedを使用していない場合は、Perlを使用することをお勧めします。これには、変更したい単語を指定する機能も含まれています。

「ファイル」に以下が含まれている場合

I 4want5to%change
#One two three four
Spring&summer^winter

その後、このコマンドは

$ perl -lnse '
    BEGIN {
        $i = ($first - 1) * 2;
        $j = ($second - 1) * 2;
    }
    @tokens = /([[:alpha:]]*)([^[:alpha:]]*)/g;
    ($tokens[$i], $tokens[$j]) = ($tokens[$j], $tokens[$i]);
    print join "", @tokens;
' -- -first=1 -second=3 file

出力

to 4want5I%change
two#One  three four
winter&summer^Spring

関連情報