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*` 匹配空字符串、`a`、`aa` 等。 * `\s*` 匹配零个或多个空白字符(包括完全没有空格的情况)。 4. **`+`** * 匹配**前面的字符(或字符集)的至少一次**(即一到多次)。 * 例如: * `a+` 匹配 `a`、`aa` 等,但不匹配空字符串。 * `\s+` 匹配一个或多个连续的空白字符。 5. **`?`** * 匹配**前面的字符(或字符集)的零次或一次**。 * 例如: * `a?` 匹配空字符串或 `a`。 6. 以上解决方案中满足需求的是前4个,1个以上连续空格替换为指定的下划线。如果字符串中只有两个空格,那么最后一个碰巧也满足 *** ** * ** *** #### **4,实际的问题** **1.** 有两个空格,**为什么 `s/\s+/_/g` 和 `s/\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.`(空格 + 任意字符)**: * 严格匹配特定模式,适用于仅替换空格后紧跟的内容。

相关推荐
minji...3 分钟前
linux 进程控制(一) (fork进程创建,exit进程终止)
linux·运维·服务器·c++·git·算法
I · T · LUCKYBOOM6 分钟前
21.Linux网络设置
linux·运维·网络
Likeyou78 分钟前
关于Linux下的Oracle的rman备份操作指南
linux·运维·oracle
峰顶听歌的鲸鱼12 分钟前
13.docker部署
linux·运维·笔记·docker·容器·云计算
橘子编程14 分钟前
仓颉语言变量与表达式解析
java·linux·服务器·开发语言·数据库·python·mysql
虚神界熊孩儿20 分钟前
linux下创建用户和用户组
linux·运维·服务器
hhwyqwqhhwy22 分钟前
linux 驱动 rtc
linux·运维·实时音视频
python百炼成钢24 分钟前
53.Linux regmap驱动框架
linux·运维·服务器·驱动开发
python百炼成钢27 分钟前
54.Linux IIO驱动框架
linux·运维·服务器·驱动开发
纷飞梦雪28 分钟前
ubuntu22开启root
linux·运维·ubuntu