【问题标题】:Why doesn't this sed statement work?为什么这个 sed 语句不起作用?
【发布时间】:2012-09-27 14:34:35
【问题描述】:

过去几天我在课堂上一直在使用正则表达式。我无法确定为什么这个表达式不起作用。我正在寻找如下表达式:

value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};

这是我使用的表达式:

sed -n '/^[*0-9A-Za-z_]+ *= *( *[0-9A-Za-z_]+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]};/p'     structfile

我错过了什么,因为它什么也没返回。还有一个旁注,我在某些表达式中使用了 [^,] ,但我仍然得到带有 , s 的行。我错过了什么?

【问题讨论】:

  • 哇,我不知道我做错了什么,但是是的,您的所有解决方案都有效。我想我只是愚蠢。非常感谢大家的帮助,我真的很感激。

标签: regex sed


【解决方案1】:

你需要转义+;并将{[0-9A-Za-z, ]} 修复为{[0-9A-Za-z, ]*}

sed -n '/^[*0-9A-Za-z_]\+ *= *( *[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile


me@localhost:~$ cat structfile 
value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};
not astruct
notastructstr =

me@localhost:~$ sed -n '/^[*0-9A-Za-z_]\+ *= *( *[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile
value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};

【讨论】:

  • 没试过。我发誓没有任何效果。我尝试了很多东西。
  • 并非所有版本的 sed 都将 + 识别为特殊字符。代替[*0-9A-Za-z_]\+,使用[*0-9A-Za-z_][*0-9A-Za-z_]*
【解决方案2】:

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

sed '/^\S\+\s\+=\s\+(\s*\S\+\(\s\+\S\+\)\?\s*){\s*\S\+\s*,\s*\S\+\s*};/!d' file
  • 首先构建一个松散的正则表达式,仅使用空格 (\s)、非空格 (\S) 和文字 (=,(,),{,} 和 @ 987654329@)
  • 确定上述是否为 1 或更多、0 或更多或 0 或 1,例如一个或多个空格将由\s\+ 表示,零个或多个非空格将由\S* 和零或一个分组将\(\s\+\S\+\)\?
  • 尝试使用^ 作为字符串开头、$ 字符串结尾以及在多行正则表达式\n 中作为换行符来锚定正则表达式
  • 慢慢构建正则表达式,从左到右,边检查每一部分
  • 有了工作版本后,将单个空格/非空格替换为更具体的字符类
  • 将一个或多个类进一步细化到特定范围或数字,例如一对三 (\{1,3\}) 或 3 (\{3\}) 当然单个类、文字或组不需要限定

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多