多行正则表达式

时间:2017-06-07 18:58:47

标签: regex sed

我有以下文件,我正在尝试使用/\|\".*\"\|/gm匹配multi line..end here,但正则表达式找不到使用sed -e ':a;N;$!ba;s/\|\".*\"\|/abcxyz/gm' t > t.2的内容,我无法找出它有什么问题。

    |2012-10-12 13:41:08.067|2012-10-12 13:45:03.282|f||"multi line star t herer erj
jdkajdkfj 
   end here"|2017

3 个答案:

答案 0 :(得分:0)

引用the GNU sed manual

  

正则表达式匹配的'M'修饰符是GNU'sed'        扩展,指示GNU'sed'匹配正则表达式        在'多线'模式下。修饰符使'^'和'$'匹配        分别(除正常行为外)空字符串        换行后,换行前的空字符串。有        特殊字符序列('''和'\'')总是匹配        缓冲区的开头或结尾。另外,期间        字符与多行模式中的换行符不匹配。

(强调补充)

您需要添加\n以明确匹配(可能是多个?)换行符,否则以不同的方式执行。我建议使用[^\"]代替.*,除非您知道文件中每条记录只有一个引用字段。

答案 1 :(得分:0)

sed用于单个行的简单替换,全部。如果你使用s,g和p以外的sed结构(使用-n)那么你使用的功能在20世纪70年代中期发明时已经过时了。

使用GNU awk进行多字符RS:

$ awk -v RS='multi line.*end here' 'RT{print RT}' file
multi line star t herer erj
jdkajdkfj
end here

如果这不是你想要的,那么编辑你的问题以澄清预期的输出和你的匹配要求(字符串vs regexp,区分大小写与不敏感,部分vs完全等)

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -e ':a;N;$!ba;s/|".*"|/|"abcxyz"|/' file

|"不需要引用。如果|被引用,它将作为交替元字符,即this|that表示这个或那个。

N.B。 :a;N;$!ba构造将整个文件存入内存,因为.*贪婪,可能会匹配多条记录。