$ 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
可変空間にも一致します。