我知道如何替换字符串;例如,将文件中的连字符替换为下划线。
但是,对于给定文件中尖括号内的所有文本,我希望用下划线替换所有连字符。
例如,下面的文件:
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
应改为:
<charset_params>
<input_charset>
<resource_path>/*</resource_path>
<java_charset_name>UTF-8</java_charset_name>
</input_charset>
</charset_params>
请注意,UTF-8
它没有改变,因为它不在尖括号内。我怎样才能做到这一点?
做
s/\(<[^>]*\)-\([^>]*>\)/\1_\2/g
查找 a ,<
一堆(零个或多个)不是>
的字符,一个连字符 (-
),另一个是一堆不是 的字符,>
最后是一个>
. 它用-
, 和之前的_
部分和 . 之后的部分替换它-
。操作员将g
导致它一次执行多个替换,但它一次只能执行一个<
……>
。所以,例如,将更改为
请注意,只有包含连字符的每个
<
...>
单词都被更改了,但有两个连字符 (<the-lazy-dog>
) 的单词只更改了第二个-
。说,如果进行了任何替换,t loop
请返回并尝试找到更多。使用 perl 更容易:
或者:
编辑文件
i
n-place。在文件中使用您的示例:
以下 awk 将以下列方式完成工作,它将“>”解释为要处理的节的结尾,并将使用“<”作为节的开头,因此在节内不考虑什么将保存在数组部分中,然后将处理节内的所有内容以使用 gsub 进行所需的替换,之后脚本必须恢复处理范围之外的分隔符和内容:
结果如下:
高温高压
使用 GNU awk 作为第三个参数来匹配()和 gensub():
在每个 Unix 机器上的任何 shell 中使用任何 awk:
使用
xq
which 是一个命令行 XML 解析器,它是来自https://kislyuk.github.io/yq/yq
的工具包的一部分(它是众所周知的 JSON 解析器的包装器):jq
这递归地遍历给定 XML 文件的整个结构,如果当前事物是一个对象,它会将在该对象中找到的所有键中的所有破折号替换为下划线。
例子:
该工具可以使用或选项
xq
执行就地编辑。-i
--in-place