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

答え2

one=word ; two=phrase ; three=$one
one="${two%"${two#?}"}${one#?}"  
two="${three%"${three#?}"}${two#?}"
echo "$one $two"
> pord whrase

答え3

考えられる解決策awk

echo 'foo bar' | awk '{x=substr($1,1,1); y=substr($2,1,1); sub(x, y, $1); sub(y, x, $2); print $0}'
boo far

これら 2 つのsubstr関数呼び出しは各レコードから最初の文字を抽出し、関数への 2 つのsub呼び出しはこれらの文字の最初の出現を互いに置き換えます。

答え4

sedを使用してください:

echo 'one two' |sed -re 's/([^ ])([^ ]+)( +)([^ ])([^ ]+)/\4\2\3\1\5/'
tne owo

可変空間にも一致します。

関連情報