使用 sed 替换 *\n.*\n=

使用 sed 替换 *\n.*\n=

文件中给定的文本如下:

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以下仅针对最后一行执行并交换两个空格,因此收集在保留空间中的整个文件现在位于模式空间中

相关内容