使用sed命令用模式替换多行字符串

时间:2018-01-01 15:05:43

标签: string bash shell sed

我想替换内容为多行的字符串。在每一行的末尾,它可以是a / n或\ r \ n,对于缩进,它可以是制表或空格,我不知道。我认为找到字符串的最好方法是使用模式并使用sed替换它。这是文件的内容:

<Element Blabla>        
        A content
        A second content
        A third content
</Element>
<Element TheSearchedElement>        
        A content
        A second content
        A third content
</Element>
<Element Blabla2>        
        A content
        A second content
        A third content
</Element>

我想替换这个块:

<Element TheSearchedElement>        
        A content
        A second content
        A third content
</Element>

通过这个块:

<Element TheSearchedElement>        
        A content
        A second replaced
        A third content
</Element>

我想我应该创建一个变量oldPattern,它包含要查找的模式和一个包含要写入的新模式的变量newPattern。 这是我脚本的内容:

$oldPattern='<Element TheSearchedElement>*A content*A second content*A third*content*</Element>'
$newPattern='<Element TheSearchedElement>/n/tA content/n/tA second replaced/n/tA third*content/n</Element>'
sed -e '/oldPattern/newPattern/' file.conf

问题是输出时出错: script.sh:1:script.sh:= 内容第二个内容第三个​​内容*:未找到 script.sh:2:script.sh:= / n / tA内容/ n / t第二次替换/ n / tA第三次*内容/ n:未找到 sed:-e expression n°1,char 14:命令后无用的字符

我希望你能帮助我。

2 个答案:

答案 0 :(得分:1)

请您试着跟随并告诉我这是否对您有帮助。

money

如果您想将输出保存到相同的Input_file本身,请执行以下操作(如果您对上述命令的结果感到满意):

c

答案 1 :(得分:0)

您不需要进行多线替换,只需将替换限制在地址范围内:

delete from @TempTable where id in(
        select  id
        from 
        (select ROW_NUMBER() over(partition by  Dep,  NrInvoiceLine, OfficeId, pol,  pod,  PreCarr, WarehouseId, DestinationPrecarr,
         DestinationWarehouseId, PortTerminalId, Product, isnull(description, ''), ScaleCalcuationId, isnull(scalefrom, 0), isnull(scaleto, 0),  
         CurrencyCode, Base, ShippingLineID, ContainerId, AgentId order by type) Record, a.id
        from  @TempTable a where cast(Date as smalldatetime) = '2078-12-31 00:00:00' and IsDeleted = 0 and 
        (RO = 1 or RO=2) and (PP = 0 or PP = 2) 
        )as b   
        where b.Record !=1 )