Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed替换删除文本块_Regex_Sed_Non Greedy - Fatal编程技术网

Regex sed替换删除文本块

Regex sed替换删除文本块,regex,sed,non-greedy,Regex,Sed,Non Greedy,我想使用SED在许多文件中查找和替换一小串文本 具体而言,我要执行的替换是: sed -e '/35=R/s/|131=.*|/|131=$UNIQUE|/g' $f 它在bash脚本中运行,其中$f是文件名 sed搜索包含字符串35=R的行,然后用一个非常简单的表达式将|131=.*.(在|131=)之后的任何内容)替换为|131=$UNIQUE 这在某些文件上似乎非常有效,但在其他情况下: 例如,工作示例: 之前: 8=FIX.4.2|9=151|35=R|56=ABC|142=7848|

我想使用SED在许多文件中查找和替换一小串文本

具体而言,我要执行的替换是:

sed -e '/35=R/s/|131=.*|/|131=$UNIQUE|/g' $f
它在bash脚本中运行,其中$f是文件名

sed搜索包含字符串35=R的行,然后用一个非常简单的表达式将
|131=.*.
(在
|131=)之后的任何内容)替换为
|131=$UNIQUE

这在某些文件上似乎非常有效,但在其他情况下:

例如,工作示例:

之前:

8=FIX.4.2|9=151|35=R|56=ABC|142=7848|50=STUFF|49=OTHERSTUFF|52=20250905-06:00:10.910|34=107|146=1|55=DE123|22=4|48=DE123|38=1|54=1|207=F|131=12ABC|10=243
8=FIX.4.2|9=147|35=R|34=15301|49=STUFF|52=20190905-15:27:54.305|56=OTHERSTUFF|115=STUFFY|131=1234abc|146=1|55=AB123|15=ZYX|22=4|38=1|48=AB123|54=2|207=STUFF|10=253
之后:

8=FIX.4.2|9=151|35=R|56=COBA|142=7848|50=STUFF|49=OTHERSTUFF|52=20250905-06:00:10.910|34=107|146=1|55=DE123|22=4|48=DE123|38=1|54=1|207=F|131=$UNIQUE|10=243
8=FIX.4.2|9=147|35=R|34=15301|49=STUFF|52=20190905-15:27:54.305|56=OTHERSTUFF|115=STUFFY|131=$UNIQUE|10=253
然而,在其他情况下,它的输出似乎丢失了大块文本

示例不起作用:

之前:

8=FIX.4.2|9=151|35=R|56=ABC|142=7848|50=STUFF|49=OTHERSTUFF|52=20250905-06:00:10.910|34=107|146=1|55=DE123|22=4|48=DE123|38=1|54=1|207=F|131=12ABC|10=243
8=FIX.4.2|9=147|35=R|34=15301|49=STUFF|52=20190905-15:27:54.305|56=OTHERSTUFF|115=STUFFY|131=1234abc|146=1|55=AB123|15=ZYX|22=4|38=1|48=AB123|54=2|207=STUFF|10=253
之后:

8=FIX.4.2|9=151|35=R|56=COBA|142=7848|50=STUFF|49=OTHERSTUFF|52=20250905-06:00:10.910|34=107|146=1|55=DE123|22=4|48=DE123|38=1|54=1|207=F|131=$UNIQUE|10=243
8=FIX.4.2|9=147|35=R|34=15301|49=STUFF|52=20190905-15:27:54.305|56=OTHERSTUFF|115=STUFFY|131=$UNIQUE|10=253
正如您所看到的,131=$UNIQUE之后的管道缺少所有内容。我对表达式和sed相当陌生,所以可能我误解了替换部分。任何指点都将不胜感激


谢谢。

*
替换为
[^ |]*
在第一个

之前停止
*
您的第一个示例(不)很幸运,因为在
131=
除法之后没有任何
字符

这里的问题是,
*
匹配任何字符序列,包括任何垂直条(
|
)字符。因此,您需要从匹配的内容中排除
|
。因此,使用
[^ |]*

另外,
\
可能有特殊的含义,因此当它不在括号中时,您可能需要对其进行转义(
\\\\

但即便如此,你也没有走出困境。
131=
分区显然可以在线路上移动。也就是说,它可能是第一个,也可能是最后一个。您只需取消关闭
|
,即可将其设置为最后一个:

sed -e '/35=R/s/|131=[^|]*/|131=$UNIQUE/g' $f
(我用Visual Studio search and replace对此进行了测试,因为它很方便,
sed
不是。但它做到了您想要的。)

如果
131=
分区可能是行中的第一个分区,则需要添加另一个表达式:

sed -e '/35=R/s/|131=[^|]*/|131=$UNIQUE/g' -e '/35=R/s/^131=[^|]*/131=$UNIQUE/g' $f
sed -e '/35=R/s/|131=[^|]*|/|131=$UNIQUE|/g' $f

*
表达式是“贪婪的”。这意味着它将尝试捕获尽可能多的字符。在示例中,它位于最右侧的
|
符号。您应该使用以下表达式:

sed -e '/35=R/s/|131=[^|]*/|131=$UNIQUE/g' -e '/35=R/s/^131=[^|]*/131=$UNIQUE/g' $f
sed -e '/35=R/s/|131=[^|]*|/|131=$UNIQUE|/g' $f

Sed正则表达式是基本的REs,除非您使用
-E
(或
-r
,弃用)调用Sed。就像格雷普一样。所以反斜杠
|
会让它变得特别。(这可能与VS search&replace不同。)@rici这是你的Visual Studio。我认为这更像是sed的一个怪癖
|
这意味着替代品在当今相当标准。但是像sed和grep这样的旧实用程序使用BREs,如果您想进行替换,就必须在BREs中编写
\\124;
|
只是一个常规字符。所以你的答案在这一点上是不正确的。@rici如果可以的话,我只想添加黄鼠狼的话,以涵盖所有的可能性。由你决定,但黄鼠狼仍然是错误的:-)我不相信Gnu sed的ERE支持包括非贪婪的重复。哦,你是对的!我还是很抱歉…我改变了我的答案!非常感谢!我向大家道歉。