2つの単語の最初の文字を置き換える方法は?

2つの単語の最初の文字を置き換える方法は?
$ 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

おすすめ記事