如何切换两个单词的首字母?

eva*_*ine 4 sed perl

$ echo 'foo bar' | sed SOMEMAGIC
boo far
$ echo 'one two' | sed SOMEMAGIC
tne owo
Run Code Online (Sandbox Code Playgroud)

问:一般情况下,如何将“bar”中的“b”替换为“foo”中的“f”?反过来,将“foo”中的“f”替换为“bar”的“b”。

dev*_*ull 6

您需要使用捕获组。捕获(1)一个单词的第一个字母,(2)直到第二个单词的第一个字母为止的所有内容,(3)第二个单词的第一个字母并交换(3)和(1)。

在下面的示例中,假设该行以非空白字符开头

你可以说:

sed 's/\(.\)\([^ ]* \)\(.\)/\3\2\1/'
Run Code Online (Sandbox Code Playgroud)

或者

sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
Run Code Online (Sandbox Code Playgroud)

例如,

$ echo 'foo bar' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
boo far
$ echo 'one two' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
tne owo
Run Code Online (Sandbox Code Playgroud)

以下内容也将处理行首空格和两个单词之间的多个空格等情况:

sed -r 's/([^ ])([^ ]* +)(.)/\3\2\1/'
Run Code Online (Sandbox Code Playgroud)

相应的 perl 表达式为:

perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)