【问题标题】:Regular Expression to remove all lines containing only 1 word正则表达式删除仅包含 1 个单词的所有行
【发布时间】:2018-10-04 04:25:13
【问题描述】:

我正在尝试创建一个正则表达式,它可以找到任何包含一个单词的行。由连字符或符号(例如测试词)或前导空格分隔的单词仍应被视为单个单词。

$cat file1
this line has many words
hello
  test-hi
this does aswell

使用正则表达式

'/^\s*(\w+)\s$/GM'

只返回“hello”而忽略“test-hi”

我能够捕获所有单个单词,但不能捕获带有连字符等的单词!

【问题讨论】:

  • 不知道你所说的GM sed 标志是什么意思。你能补充一些你为什么使用它们的细节吗?如果你的sed 版本支持它们?
  • 嗨,我正在使用 regexr.com 在浏览器中构建表达式。如果没有全局标志,我无法捕获测试中的所有行。我对这一切仍然很陌生,所以如果它看起来很奇怪,可能不会朝着正确的方向前进。干杯
  • 哦,好的,像 regexr 这样的在线网站可能很有用,但您只需要将它们用于那些特定的语言(它将在页面的某处提到).. regex 语法和功能之间有很大差异编程语言和 cli 工具,甚至在同一工具的不同实现之间。有关详细信息,请参阅unix.stackexchange.com/questions/119905/…

标签: regex sed


【解决方案1】:

使用awk 更容易做到这一点,默认情况下,它会根据一个或多个连续空格将每条记录分成多个字段,并且行首/行尾的空格不会成为字段计算的一部分

$ awk 'NF==1' ip.txt
hello
  test-hi
$ awk 'NF>1' ip.txt
this line has many words
this does aswell

NF是一个内置变量,表示输入记录中的字段数

【讨论】:

  • 虽然这不使用正则表达式,但它很简单并且可以完美运行。干杯
【解决方案2】:

你可以使用

^\s*([\w-]+)\s*$

增加了对连字符的支持,使第二个\s 匹配“零个或多个”空格。保留您的 GM 标志。

Demo

【讨论】:

    【解决方案3】:

    尝试使用\S 匹配任何非空白字符:

    '/^\s*(\S+)\s$/GM'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多