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

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

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

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

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

答案1

您可以使用循环+条件分支来完成:

$ 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

或者更紧凑

$ 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

答案2

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

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

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

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

答案3

你只需要一个正则表达式使用展望。很遗憾sed不支持环视所以你需要使用珀尔

$ echo "hello woRLd 12ab34" | perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g'
h e l l o w o R L d 12a b34

$ perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g' file.txt
h e l l o w o R L d 12a b34

perl -pne如果有多个输入行需要处理并perl -i -pe就地编辑文件,则使用

相关内容