0

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

[^,]*

但我也想匹配字符串中任何地方的任何空白字符、制表符、空格、换行符等。

编辑:

这是通过 :%s/foo/bar/gc 在 vi​​m 中使用 sed。

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

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

一世

4

2 回答 2

0

要在使用multilineSED使用RegEx,您应该看看这里

编辑:

SED命令中,使用 NewLine 有点不同。SED命令支持三种模式来管理多行操作NP以及D. 要了解它是如何工作的,请参阅(使用多行)说明。这里讨论这三个操作。

我的猜测是Noperator 是这里缺少的考虑区域。添加N运算符将允许\n在字符串中进行感知。

这里的一个例子:

有时希望在 sed 脚本中使用换行符。好吧,这里有一些微妙的问题。如果要搜索新行,则必须使用“\n”。这是一个示例,您搜索一个短语,然后删除该短语之后的换行符 - 将两行连接在一起。

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

这会产生

一个 xy

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

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

生成

一个 X

是的

于 2012-11-17T11:13:00.367 回答
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运行命令,该命令将第一个逗号之前的所有字符与(多行)模式空间匹配,并执行替换。
于 2012-11-17T18:38:07.460 回答