如何用四个字母反转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)
但它并不像我预期的那样有效.
对于所有情况,不确定是否可以使用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代码放在替换部分中.这种形式适合于容易地改变要反转的单词的长度