【问题标题】:Regular Expression with grep or sed does not work [duplicate]使用 grep 或 sed 的正则表达式不起作用 [重复]
【发布时间】:2020-01-25 14:43:58
【问题描述】:

我想通过 linux 命令“grep”来使用正则表达式。 目前我有一个看起来像这样的文件..

X.54(val)(08)(15)(4)
(32)(0.001)(77)(90)
X.54(val)(08)(15)(4)
(33)(0.001)(77)(90)
X.54(val)(08)(15)(4)
(34)(0.001)(77)(90)

我的目标是使用正则表达式,它给我以下结果

X.54(val)(08)(15)(4)
(32)
X.54(val)(08)(15)(4)
(33)
X.54(val)(08)(15)(4)
(34)

目前我正在使用这个正则表达式

(^\((.*?)\))

适用于https://regexr.com/ 很好,但使用 命令“grep”或“sed”不起作用...

sed -e '/(^\((.*?)\))/gm'
grep '/(^\((.*?)\))/gm'

谁能帮帮我....?

提前致谢, 马库斯

【问题讨论】:

  • 有什么规则可以得到你想要的结果?
  • POSIX 基本正则表达式,如 sed 和普通 grep 使用,不支持 ?
  • 和 grep 一起,//gm 将那些文字字符串作为正则表达式的一部分查找......

标签: regex linux shell sed grep


【解决方案1】:

这是grep

$ grep -o "^\(([^)]*)\|[^(].*\)" file

输出:

X.54(val)(08)(15)(4)
(32)
X.54(val)(08)(15)(4)
(33)
X.54(val)(08)(15)(4)
(34)

基本上从头开始输出 ([^)]*) [^(].*

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/^X/!s/).*/)/' file
    

    如果一行不以X 开头,则将第一个) 到行尾的所有内容替换为)

    【讨论】:

      【解决方案3】:

      这是sed 解决方案:

      sed '/^[^X]/s/\(([0-9]*)\).*/\1/' yourfile
      

      在哪里

      • /^[^X]/ 会将以下命令 (s) 的范围限制为与模式 ^[^X] 匹配的行,
      • s 是替换命令,
      • \(([0-9]*)\).* 是匹配的正则表达式(括号之间为0或多个数字,后跟任意字符),其中一部分被\(\)捕获
      • \1 是由第一个\(\) 组捕获的文本的替换字符串

      显然,您可以根据您的示例是否足够通用来优化命令(简化或使其更复杂)。

      【讨论】:

        猜你喜欢
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 2012-10-26
        • 2016-08-16
        • 2012-12-18
        • 2014-09-03
        • 1970-01-01
        相关资源
        最近更新 更多