Regex sed仅使用正则表达式编辑文件的一部分

Regex sed仅使用正则表达式编辑文件的一部分,regex,linux,bash,sed,grep,Regex,Linux,Bash,Sed,Grep,我有一个名为test.txt的文件,其中包含以下内容 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <test time="60" id="01"> <java.lang.String value="cat"/><java.lang.String value="dog"/> <java.lang.String value="mouse"/> <java.lang.S

我有一个名为test.txt的文件,其中包含以下内容

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test time="60" id="01">
<java.lang.String value="cat"/><java.lang.String value="dog"/>
<java.lang.String value="mouse"/>
<java.lang.String value="cow"/>
</test>
我尝试使用以下命令提取该特定部分:

$less test.txt | grep -Po 'java.lang.String value="\K[^"]*' | awk -F: '{print "<animal>" $1 "</animal>"}'
$less test.txt | grep-Po'java.lang.String value=“\K[^”]*'| awk-F:“{print”“$1”“}”
输出为我提供了更改的部分,但我希望此更改的部分与文件的其余部分保持不变:

<animal>cat</animal>
<animal>dog</animal>
<animal>mouse</animal>
<animal>cow</animal>
cat
狗
老鼠
母牛

我不熟悉脚本编写,我不知道如何将完整的输出写入文件。

sed-r的#
sed-r的#确定命令中的一些问题:

sed -r 's#<java.lang.String value="([^"]*)"/>#<animal>\1</animal>#g' test.txt
less test.txt | grep -Po 'java.lang.String value="\K[^"]*' | awk -F: '{print "<animal>" $1 "</animal>"}'
然后您使用
grep
选择与字符串匹配的行,因此基本上,您的命令序列只显式地保留具有
java.lang..
字符串的行,去掉所有其他内容。。。更简单的解决方案是使用
sed

sed -r 's,<java.lang.String value="([^"]*)"\s*/>,<animal>\1</animal>,g' test.txt
运行:

结果:

<?xml version="1.0"?>
<test time="60" id="01">
  <animal value="cat"/>
  <animal value="dog"/>
  <animal value="mouse"/>
  <animal value="cow"/>
</test>


,甚至在您需要使用命令行工具处理它之前。

确定命令中的一些问题:

less test.txt | grep -Po 'java.lang.String value="\K[^"]*' | awk -F: '{print "<animal>" $1 "</animal>"}'
然后您使用
grep
选择与字符串匹配的行,因此基本上,您的命令序列只显式地保留具有
java.lang..
字符串的行,去掉所有其他内容。。。更简单的解决方案是使用
sed

sed -r 's,<java.lang.String value="([^"]*)"\s*/>,<animal>\1</animal>,g' test.txt
运行:

结果:

<?xml version="1.0"?>
<test time="60" id="01">
  <animal value="cat"/>
  <animal value="dog"/>
  <animal value="mouse"/>
  <animal value="cow"/>
</test>


,甚至在您需要使用命令行工具处理它之前。

不适用于OP的示例,因为在
sed
中缺少“g”标志。您的答案类似于一篇关于
XML
操作的论文+1作详尽的解释。嗯。。。我不同意这是一篇关于XML的论文;-)我只是想强调使用正确的工具来完成正确的任务。与OP的示例不符,因为您的
sed
中缺少“g”标志。您的答案类似于一篇关于
XML
操作的论文+1作详尽的解释。嗯。。。我不同意这是一篇关于XML的论文;-)我只是想说明一下如何使用正确的工具来完成正确的任务。谢谢,你能解释一下这是如何产生正确的输出的吗?我不擅长SED谢谢,你能解释一下这是如何给出正确的输出的吗?我不擅长SED,请尝试使用正确的工具完成正确的任务。转换XML文档应使用XSL转换,而不是sed/grep/等。。这方面有标准的工具,它可以检查您的输入文件,因为它会为您提供正确的结果。请尝试使用正确的工具完成正确的任务。转换XML文档应使用XSL转换,而不是sed/grep/等。。有标准的工具,它可以检查你的输入文件,因为它给你正确的结果。
<?xml version="1.0"?>
<test time="60" id="01">
  <animal value="cat"/>
  <animal value="dog"/>
  <animal value="mouse"/>
  <animal value="cow"/>
</test>