bash - 为什么正则表达式中少一个空格会使我的 sed 变得奇怪?

标签 bash sed

这是我试图找出的一些正则表达式的示例。目标是去除多余的空格,并通过 sed 使其在单词之间只有一个空格。给出的示例在sdfsdk 之间有三个空格:

test@ubuntu:~/addr_book_script$ echo "est sdf   sdk" | sed 's/  */ /g'
est sdf sdk
test@ubuntu:~/addr_book_script$ echo "est sdf   sdk" | sed 's/ */ /g'
e s t s d f s d k

您会注意到两个 sed 语句的不同之处仅在于 * 之前的空格数。第一个语句有两个空格,它的行为正是我想要的。

第二个语句在 * 之前有一个空格,它在每个字母和单词之间留了一个空格。

我知道 * 表示我正在寻找的任何次数。我不明白的是为什么一个空格 sed replace 的行为方式如此。

谢谢

最佳答案

sed 's/ */ /g'

正则表达式 * 匹配 0 次或多次出现的 (空格)。

  1. 在字符串的开头找到一个 0 空格匹配项并替换为单个空格
  2. 在第一个字母之后找到另一个 0 空格匹配项并替换为单个空格等等。
  3. est后,发现多于0个空格,替换为单个空格

等等。

另一个例子:

~ >>> echo "est sdf   sdk" | sed 's/a*/ /g'
 e s t   s d f       s d k 

替换是因为0个字符匹配。

关于bash - 为什么正则表达式中少一个空格会使我的 sed 变得奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234817/

相关文章:

python - 如何像 bash 中的函数一样调用 python 脚本?

linux - 统计bash中可执行文件的数量

android - 使用 shell 命令列出所有目录,而不使用 find、busybox 命令

python - sed 保持匹配过去的换行符

bash - 将文件 A 的内容附加到文件 B 的每一行的末尾?狂欢

linux - 检查 URL 中是否有特定文本的脚本

regex - 使用 sed 将文件中的字符串替换为该名称变量的内容

regex - "sed"特殊字符处理

string - 在字符串中的每个字符后添加空格

regex - 带有特殊字符的 sed