sed 替换连续空格

1,空格表示方式

[[:space:]]+

[[:blank:]]+

' +' (这个是一个空格一个加号+) \s+ \s \s. \s*

如何替换一个以上连续的空格为一个指定字符?

假设给定的字符串是这样的 :

"LEG1 Height; LEG2 CYL DIS1; TIME"

有以下几种解决方案,格式如下,直接复制进来套可以看输出效果,文件的话替换成指定的文件名字也行

2,solution

echo "LEG1 Height; LEG2 CYL DIS1; TIME" | sed -E "s/\s+/_/g; s/; s/#//g; s/\"//g"

bash 复制代码
head -n 1 test.csv | sed -E "s/[[:space:]]+/_/g;s/;s/#//g;s/\"//g"

head -n 1 test.csv | sed -E "s/[[:blank:]]+/_/g; s/; s/#//g; s/\"//g"
 
head -n 1 test.csv | sed -E "s/ +/_/g; s/; s/#//g; s/\"//g"
head -n 1 test.csv | sed -E "s/\s+/_/g; s/; s/#//g; s/\"//g"
head -n 1 test.csv | sed -E "s/\s./_/g; s/; s/#//g; s/\"//g"

3,符号的含义

  1. \s

    • 表示匹配空白字符(包括空格、制表符、换行符等)。
    • 如果不带其他量词(如 *+),则只匹配单个空白字符
  2. .

    • 表示匹配任意单个字符(除换行符外)。
    • 仅匹配一个字符,不会连续匹配多个。
  3. *

    • 匹配前面的字符(或字符集)的零次或多次
    • 例如:
      • a* 匹配空字符串、aaa 等。
      • \s* 匹配零个或多个空白字符(包括完全没有空格的情况)。
  4. +

    • 匹配前面的字符(或字符集)的至少一次(即一到多次)。
    • 例如:
      • a+ 匹配 aaa 等,但不匹配空字符串。
      • \s+ 匹配一个或多个连续的空白字符。
  5. ?

    • 匹配前面的字符(或字符集)的零次或一次
    • 例如:
      • a? 匹配空字符串或 a
  6. 以上解决方案中满足需求的是前4个,1个以上连续空格替换为指定的下划线。如果字符串中只有两个空格,那么最后一个碰巧也满足


4,实际的问题

1. 有两个空格,为什么 s/\s+/_/gs/\s./_/g 的效果一样?

文件内容是 LEG1 Height varchar(255)(有两个空格),操作后变成 LEG1_Height varchar(255)

  • \s+

    • 匹配一个或多个连续的空白字符。
    • 两个空格被视为连续的空白字符,因此整个匹配被替换为下划线 _
  • \s.

    • 匹配一个空白字符(\s)后跟一个任意字符(.)。
    • 匹配的结果是第一个空格和其后一个字符 ,即:匹配 ␣H(空格 + H)。
    • 替换时,只保留了后续未被匹配的内容。

区别在于

  • 对于连续多个空格,\s+ 会整体匹配并替换,而 \s. 只会替换一次,替换的范围是第一个空格及其后一个字符
  • 在您的文件内容中,替换结果一样是因为替换的具体情况不复杂(两个空格在这种场景中等价处理)。

2. 为什么用 * 会影响没有空格的内容?

  • \s* 匹配零个或多个空白字符

    • 即使某处没有空格,\s* 也能匹配零个空格(空字符串)。
    • 例如:
      • 输入:LEG1Height
      • 替换:s/\s*/_/g 会在每个字符之间插入下划线,结果为:_L_E_G_1_H_e_i_g_h_t_
  • \s+ 匹配一个或多个空白字符

    • 如果没有空格的地方,\s+ 不会匹配,因此不会替换没有空格的内容。

总结:量词的适用场景

  1. \s*(零次或多次)

    • 会匹配空白字符,也会匹配空字符串,适用于希望尽量覆盖所有情况(即使没有空格的地方)。
    • 常用场景:在任意字符间添加标记。
  2. \s+(至少一次)

    • 只匹配一个或多个连续的空白字符,不匹配没有空格的地方。
    • 常用场景:替换有空格分隔的内容。
  3. \s.(空格 + 任意字符)

    • 严格匹配特定模式,适用于仅替换空格后紧跟的内容。
相关推荐
Joyner201819 分钟前
bash 判断内存利用率是否高于60%
开发语言·bash
乱蜂朝王1 小时前
Linux更改远程默认SSL端口
linux·服务器·ssl
马立杰1 小时前
LVS能否实现两台服务器的负载均衡
linux·lvs
kaoa0001 小时前
Linux入门攻坚——41、Linux集群系统入门-lvs(2)
linux·运维
阿秋.1221 小时前
Ansible运维实战-自动化安装nginx
linux·运维·服务器·自动化·ansible
运维小文1 小时前
ansible安装和常用模块的使用
linux·运维·自动化·ansible·devops
明明跟你说过1 小时前
在CentOS 7中安装与配置【Ansible】的详细指南
linux·运维·centos·ansible
m0_748235952 小时前
国产化-Tomcat替换——TongWeb的安装和使用
linux·服务器·tomcat
社畜码农且逊2 小时前
Ubuntu22.04搭建FTP服务器保姆级教程
linux·运维·服务器
inter_peng2 小时前
[工具升级问题] 钉钉(linux版)升级带来的小麻烦
linux·运维·钉钉