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

    • 严格匹配特定模式,适用于仅替换空格后紧跟的内容。
相关推荐
lengjingzju11 分钟前
编译与调试完全指南—第6章 性能分析工具
linux
躺不平的理查德1 小时前
嵌入式 Linux 系统移植与 SD 卡量产镜像制作
linux·运维·服务器
一直走下去-明2 小时前
centos7无法安装tcpreplay
linux·运维
吹什么轩2 小时前
linux网络:TCP套接字基础
linux·网络·tcp/ip
时空无限3 小时前
ubuntu dpkg -l 输出第一列解释
linux·运维·ubuntu
叮咚侠5 小时前
Ubuntu 24.04 安装zabbix-agent 5.0 服务
linux·ubuntu·zabbix·zabbix-agent
左手厨刀右手茼蒿7 小时前
数据仓库的架构演进:从MySQL到ClickHouse到数据湖的工程化实践
linux·嵌入式·系统内核
左手厨刀右手茼蒿7 小时前
创业团队技术选型:别用大厂架构解决小团队问题
linux·嵌入式·系统内核
bosins8 小时前
将 Hyper-V 上的 Ubuntu 虚拟机内容迁移到 WSL (Windows Subsystem for Linux) 中
linux·windows·ubuntu
我星期八休息9 小时前
扩展—DNS与ICMP
linux·服务器·网络