単語には文字のみが許可され、他の文字は区切り文字です。最初の単語を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