【问题标题】:Replace a multiline string with pattern using sed command使用 sed 命令将多行字符串替换为模式
【发布时间】:2018-01-01 15:05:43
【问题描述】:

我想替换内容为多行的字符串。在每一行的末尾,它可以是 /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/tA 第二替换/n/t第三*内容/n: 未找到 sed: -e expression n°1, char 14: 命令后的无用字符

希望你能帮助我。

【问题讨论】:

  • 这是一个 XML 文件吗?
  • @Cyrus,不,这是一个 apache 配置文件。

标签: string bash shell sed


【解决方案1】:

您能否尝试关注一下,如果这对您有帮助,请告诉我。

awk '/<Element TheSearchedElement>/{print;getline;print;getline;print "        A second replaced";next} 1'  Input_file

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

awk '/<Element TheSearchedElement>/{print;getline;print;getline;print "        A second replaced";next} 1'  Input_file > temp_file && mv temp_file  Input_file

【讨论】:

  • 你好,谢谢它的工作,但我更喜欢使用命令sed,因为如果一天,块中要替换的行的位置发生变化,脚本将无法工作。
【解决方案2】:

你不需要做多行替换,你只需要将你的替换限制在一个地址范围内:

sed '/^<Element TheSearchedElement>$/,\@^</Element>@{/second/s/content/repl/; }' input

【讨论】:

  • 您好,感谢您的回答,但它不起作用。我没有错误,只是输出中的文件内容,但没有任何更改。
  • @Anonyme:删除$。您的行包含尾随空格。
  • 好了,现在终端显示的输出修改成功了,但是文件本身没有修改,怎么直接修改呢?谢谢。
  • 创建一个临时文件并移动它。或者,如果你使用的是 gnu sed,你可以使用-i
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 2014-10-19
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多