【问题标题】:Why is sed not matching excess whitespace between non-whitespace characters为什么 sed 不匹配非空白字符之间的多余空白
【发布时间】:2017-08-23 19:19:32
【问题描述】:

我有一个删除多余空格的 sed oneliner:

sed -e 's/^\s*//' -e 's/\s*$//' -e 's/\s{2,}/ /g'

当我在" \tone1 two\t3three\t " 上对其进行测试时,sed 删除了行首和行尾的空格,但与单词之间多余的空格不匹配,并且 sed 返回\tone1 two\t3three。我想要的是\tone1 two 3three,所以sed -e 's/[ \t]{2,}/ /g' 不起作用。

regexr.com 将表达式显示为函数式。

我的版本是 GNU sed 版本 4.2.1。

【问题讨论】:

  • 我认为大括号需要转义。但无论如何你都不需要它们。只需's/\s\+/ /g'

标签: sed


【解决方案1】:

{} 需要在 sed 使用的基本正则表达式模式下进行转义。

但是,您可以将此sedalternation 的单个替换一起使用:

sed -E 's/^[[:blank:]]+|[[:blank:]]+$|[[:blank:]]{2,}//g' file

POSIX 字符类[[:blank:]] 匹配空格或制表符。

【讨论】:

  • 我猜[[:blank:]]+{2,} 是一个错字,你的意思是[[:blank:]]+[[:blank:]]{2,}
  • 确实,这是一个错字。谢谢!
  • 所以我已经将它改写为sed -r 's/[[:blank:]]+/ /g;s/^\s|\s$//g',但是为什么[[:blank:]] 工作而不是\s
  • 不,它现在正在工作。需要注意的是,单个替换不会删除前导或尾随空格。我的最终答案是sed -r 's/\s+/ /g;s/^\s|\s$//g'
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2018-06-02
  • 2023-04-06
相关资源
最近更新 更多