我有以下文件,我正在尝试使用/\|\".*\"\|/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
答案 0 :(得分:0)
正则表达式匹配的'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
构造将整个文件存入内存,因为.*
贪婪,可能会匹配多条记录。