如何使用 Bash 删除具有相同单词的部分

如何使用 Bash 删除具有相同单词的部分

我的目录中有一堆文件,我想从每个文件中删除部分单词。每个文件都有不同的宽度和高度数字,我想删除它们。

我现在使用以下内容,但数字更多,我认为必须有更好的方法来做到这一点。

sed -i 's/width="12"//' ./*.*
sed -i 's/width="16"//' ./*.*
sed -i 's/width="24"//' ./*.*
sed -i 's/width="25"//' ./*.*
sed -i 's/width="45"//' ./*.*
sed -i 's/height="12"//' ./*.*
sed -i 's/height="16"//' ./*.*
sed -i 's/height="24"//' ./*.*
...
...

我感谢您的帮助。谢谢。

答案1

假设输入是 XML,可能类似于

<?xml version="1.0"?>
<root>
  <tag width="23" height="34"/>
  <tag alt="something something" width="23" height="34"/>
  <tag width="23" alt="something else" height="34"/>
  <tag width="abba">Very wide</tag>
</root>

...然后,您可以从每个包含它们的文档节点中删除width和属性,如下所示:heightxmlstarlet

xmlstarlet ed --delete '//@width' --delete '//@height' file.xml

...根据我们的示例文档,将生成

<?xml version="1.0"?>
<root>
  <tag/>
  <tag alt="something something"/>
  <tag alt="something else"/>
  <tag>Very wide</tag>
</root>

对当前目录中文件名后缀为 的所有文件执行此操作.xml(假设文件数量不是太多):

xmlstarlet ed --inplace --delete '//@width' --delete '//@height' ./*.xml

由于使用该选项,对每个文件的编辑将就地进行--inplace

答案2

  • \(pattern\)- 分组
  • foo\|bar- 或运算符
  • [a-z]- 字符范围(注意区域设置)
  • \{m,n\}- 重复先前的模式,不使用 m 或 n 分别表示 0 或无限

=>\(width\|height\)="[0-9]\{1,\}"是一个正则表达式,匹配widthheight后跟=双引号内的任何正整数。

关于正则表达式(以及更多)的很好的指南可以在这里找到:格利莫尔

然而,请注意,您提供的格式是 XML 等典型格式,使用 REGEX 工具处理这些格式时存在一些危险。通常应该首选匹配的解析器。

相关内容