文件中给定的文本如下:
oldValue
=null*
persistedObjectId
="STRAN-2019-10420"*
persistedObjectVersion
=0*
propertyName
="Status"*
uri
="/oms/salesOrder/saveSalesOrder"
如何替换“*”和“=”之间的所有内容(而不是相反)?我尝试使用失败
sed 's/\*\n.*\n=//g' filename.txt
答案1
问题是,它是sed
逐行工作的,所以你的多行模式永远不会匹配。如果您使用的是 GNU sed
,您可以使用选项-z
来处理同一缓冲区中的所有行:
sed -z 's/\*[^=]*=//g' filename.txt
请注意,我还更改了您的代码:因为 是贪婪的,所以在使用 时*
它会吃掉直到最后一行的所有行,所以我将其更改为将在下一个停止。=
.*
[^=]*
=
如果没有选项-z
,您需要自己将整个文件收集到一个缓冲区中。我通常收集保留空间中的所有内容,并交换最后一行的保留空间和模式空间:
sed 'H;1h;$!d;x;s/\*[^=]*=//g'
H
将每一行附加到保留空间1h
用当前行覆盖保留空间以避免在文件开头添加换行符$!d
删除除最后一行之外的每一行并停止对这些行的进一步处理x
以下仅针对最后一行执行并交换两个空格,因此收集在保留空间中的整个文件现在位于模式空间中