用unix中的sed反转四个字母长度

Dan*_*nte 9 unix bash sed

如何用四个字母反转sed

例如:

the year was 1815.
Run Code Online (Sandbox Code Playgroud)

反向:

the raey was 5181.
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

cat filename | sed's/\([a-z]*\) *\([a-z]*\)/\2, \1/'
Run Code Online (Sandbox Code Playgroud)

但它并不像我预期的那样有效.

Sun*_*eep 6

对于所有情况,不确定是否可以使用GNU sed.如果_在四个字母单词之前/之后不立即发生,则可以使用

sed -E 's/\b([a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])\b/\4\3\2\1/gi'
Run Code Online (Sandbox Code Playgroud)

\b是字边界,字定义是任何字母或数字或下划线字符.因此,\b将确保只匹配整个单词而不是单词的一部分

$ echo 'the year was 1815.' | sed -E 's/\b([a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])\b/\4\3\2\1/gi'
the raey was 5181.
$ echo 'two time five three six good' | sed -E 's/\b([a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])\b/\4\3\2\1/gi'
two emit evif three six doog

$ # but won't work if there are underscores around the words
$ echo '_good food' | sed -E 's/\b([a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])\b/\4\3\2\1/gi'
_good doof
Run Code Online (Sandbox Code Playgroud)


具有环视支持的工具适用于所有情况

$ echo '_good food' | perl -pe 's/(?<![a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])([a-z0-9])(?!=[a-z0-9])/$4$3$2$1/gi'
_doog doof
Run Code Online (Sandbox Code Playgroud)

(?<![a-z0-9])并且(?!=[a-z0-9])分别是消极的外观和消极的前瞻

可以缩短为

perl -pe 's/(?<![a-z0-9])[a-z0-9]{4}(?!=[a-z0-9])/reverse $&/gie'
Run Code Online (Sandbox Code Playgroud)

它使用e修饰符将Perl代码放在替换部分中.这种形式适合于容易地改变要反转的单词的长度

  • `i`用于不区分大小写的匹配,否则需要`[a-zA-Z0-9]` (2认同)