$ 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”。
您需要使用捕获组。捕获(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)