regex - 使用 sed 和正则表达式来替换字符串

标签 regex linux sed

我有这个 xml 数据

<institution>
    <id>83812745840</id>
    <code>2701811200</code>
    <full_name>full name 1</full_name>
    <address>adress 1</address>
    <institution_type>
        <id>191</id>
        <code>inst code 1</code>
        <name>institution name1</name>
    </institution_type>
    <place>
        <id>812007638</id>
        <name>place-name_1</name>
        <code>415995</code></place>
    <activity>
        <code>811855905</code>
        <name>act-name-1</name>
        <equipment_specialty>false</equipment_specialty>
    </activity>
</institution>

我需要改变<code><code_><place><name><place><name_> 。如何使用 sed 和 regex 来完成此操作?

我尝试过 sed 's/<institution>.*<code>.*<\/code>/<institution>.*<code_>.*<\/code_>/g'但替换字符串上的 .* 变为 .* ,而不是与正则表达式匹配的任何字符串。

最佳答案

这里的主要问题是不要使用 XML/HTML 解析器,而在处理 XML/HTML 数据时始终应该使用它们:

使用 xmlstarlet 工具的正确方法:

xmlstarlet ed -O -r '//institution/code' -v 'code_' -r '//place/name' -v 'name_' input.xml

输出:

<institution>
  <id>83812745840</id>
  <code_>2701811200</code_>
  <full_name>full name 1</full_name>
  <address>adress 1</address>
  <institution_type>
    <id>191</id>
    <code>inst code 1</code>
    <name>institution name1</name>
  </institution_type>
  <place>
    <id>812007638</id>
    <name_>place-name_1</name_>
    <code>415995</code>
  </place>
  <activity>
    <code>811855905</code>
    <name>act-name-1</name>
    <equipment_specialty>false</equipment_specialty>
  </activity>
</institution>
<小时/>

要就地修改文件,请添加 -L 选项:xmlstarlet ed -O -L ....

关于regex - 使用 sed 和正则表达式来替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345041/

相关文章:

objective-c - 使用 NSRegularExpression 和 NSPredicate 正确评估字符串时遇到问题

正则表达式捕获部分文本,但如果找到模式则忽略其余部分

linux - 渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误

c - 提取 C 函数的参数类型

mysql - 如何在linux服务器上找到mysql服务

string - 删除不包含给定字符串的整行

正则表达式在线工作但不能在 Vim 中工作

regex - 在 Sublime Text 2 中搜索数字并对其进行一些数学评估

shell - 如何仅提取bash中两个字符串之间多行的第一个实例?

regex - 句子中的 Sed 或 Awk 或 Perl 替换