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.(空格 + 任意字符)

    • 严格匹配特定模式,适用于仅替换空格后紧跟的内容。
相关推荐
mcharleylei18 分钟前
Centos 安装docker
linux·docker·centos
jerry-891 小时前
系统安全及应用
linux·运维·服务器
AiFlutter2 小时前
在AlarmLinux系统中安装KeyDB
linux·运维·服务器
Trouvaille ~4 小时前
【Linux】命令为桥,存在为岸,穿越虚拟世界的哲学之道
linux·学习·开源·操作系统·编程·命令行·基础入门
kyle~4 小时前
Linux--权限
linux·运维·服务器
谁在夜里看海.4 小时前
【Linux-网络】初识计算机网络 & Socket套接字 & TCP/UDP协议(包含Socket编程实战)
linux·运维·服务器·网络·计算机网络
小诺大人4 小时前
Linux(Centos、Ubuntu) 系统安装jenkins服务
linux·jenkins
千航@abc5 小时前
vim如何显示行号
linux·编辑器·vim
冷影玺5 小时前
网络系统管理Linux环境——StorageSrv之Mariadb
linux·运维·mariadb
_Eden_5 小时前
Ansible入门学习之基础元素介绍
linux·学习·云原生