$ echo 'foo bar' | sed SOMEMAGIC
boo far
$ echo 'one two' | sed SOMEMAGIC
tne owo
尋ねる:通常、「bar」の「b」を「foo」の「f」にどのように変更しますか?逆に、「foo」の「f」を「bar」の「b」に置き換えます。
ベストアンサー1
キャプチャグループを使用する必要があります。 (1) 単語の最初の文字、 (2) 2 番目の単語の最初の文字までのすべての内容、 (3) 2 番目の単語の最初の文字をキャプチャして (3) と (1) を置き換えます。
次の例では、行が空白以外の文字で始まると仮定しています。
あなたは言うことができます:
sed 's/\(.\)\([^ ]* \)\(.\)/\3\2\1/'
または
sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
例えば、
$ echo 'foo bar' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
boo far
$ echo 'one two' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
tne owo
以下は、行の先頭のスペースや2つの単語の間の複数のスペースなどの状況も処理できます。
sed -r 's/([^ ])([^ ]* +)(.)/\3\2\1/'
対応するPerl式は次のとおりです。
perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
例:
$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'foo bar' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
boo far
$ echo ' one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo