sed:仅在字母之间添加空格

Che*_*nut 5 linux sed

我试图仅在字母之间插入空格,而不是在数字或其他字符之间插入空格。

hello woRLd 12ab34应该成为h e l l o w o R L d 12a b34

sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g' file.txt
Run Code Online (Sandbox Code Playgroud)

结果是h el lo w or LD 12a b34

我无法在每个字母后面插入空格,因为这不会检查后面的字母是否也是字母。

我可以运行该sed命令两次,这解决了问题,但并不优雅。如果可能的话,我需要使用 来解决这个问题sed

ste*_*ver 6

您可以使用循环+条件分支来做到这一点:

$ echo "hello woRLd 12ab34" | sed '
:a
s/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/
ta
'
h e l l o w o R L d 12a b34
Run Code Online (Sandbox Code Playgroud)

或者更紧凑

$ echo "hello woRLd 12ab34" | sed -e :a -e 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/' -e ta
h e l l o w o R L d 12a b34
Run Code Online (Sandbox Code Playgroud)


Phi*_*pos 5

您不需要运行该sed命令两次,只需ssed脚本中运行 ubstitute 命令两次即可。sed有一个优雅的方法来做到这一点:空模式//重复前面的模式:

sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g;s//\1 \2/g' file.txt
Run Code Online (Sandbox Code Playgroud)

为了可读性,我建议使用扩展正则表达式:

sed -E 's/([a-zA-Z])([a-zA-Z])/\1 \2/g;s//\1 \2/g' file.txt
Run Code Online (Sandbox Code Playgroud)