正则表达式:匹配除逗号之外的任何字符(包括空格)

时间:2012-11-17 10:55:44

标签: regex string sed string-parsing

我想匹配任何字符和除逗号之外的任何空格与正则表达式。只匹配除逗号以外的任何字符给我:

[^,]*

但我也希望在字符串中的任何位置匹配任何空格字符,制表符,空格,换行符等。

编辑:

这是在vim中使用sed:%s / foo / bar / gc。

我想找到从func开始直到逗号,在下面的示例中:

func("bla bla bla"
  "asdfasdfasdfasdfasdfasdf"
"asdfasdfasdf", "more strings")

2 个答案:

答案 0 :(得分:0)

要使用multilineSED中使用RegEx,您应该查看here

修改

SED命令中,使用NewLine有点不同。 SED命令支持三种模式来管理多行操作NPD。要查看其工作原理,请参阅this(使用多行)解释。这里讨论了这三个操作。

我的猜测是N运算符是此处缺少的考虑范围。添加N运算符将允许在字符串中感知\n

来自here的示例:

  

有时候人们希望在sed脚本中使用新的行字符。   嗯,这里有一些微妙的问题。如果想要搜索一个   新行,必须使用“\ n”。以下是您搜索的示例   一个短语,并删除该短语后的新行字符 -   将两条线连接在一起。

     

(echo a; echo x; echo y)| sed'/ x $ / {N s:x \ n:x:}'

     

生成

     

一个xy

     

但是,如果要插入新行,请不要使用“\ n” - 而是   插入一个文字换行符:

     

(echo a; echo x; echo y)| sed's:x:X \:'

     

产生

     

一个X

     

ý

答案 1 :(得分:0)

所以基本上你试图匹配多行的模式。

这是在sed中执行此操作的一种方法(非常确定这些方法在vim中无法使用,我不知道如何在vim内复制此内容)

sed '
    /func/{
            :loop
            /,/! {N; b loop}
            s/[^,]*/func("ok"/
    }
' inputfile

假设inputfile包含这些行

func("bla bla bla"
  "asdfasdfasdfasdfasdfasdf"
"asdfasdfasdf", "more strings")

输出

func("ok", "more strings")

<小时/> 的详情

  • 如果某行包含func,请输入大括号。
  • :loop是一个名为loop
  • 的标签
  • 如果该行不包含,(这是/,/!的含义)
    • 将下一行附加到模式空间(N
    • 分支到/转到loop标签(b loop
  • 因此,它将继续添加行并循环直到找到,,然后运行s命令,该命令匹配第一个逗号对(多行)模式空间之前的所有字符,并进行更换。