我的目录中有一堆文件,我想从每个文件中删除部分单词。每个文件都有不同的宽度和高度数字,我想删除它们。
我现在使用以下内容,但数字更多,我认为必须有更好的方法来做到这一点。
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
和属性,如下所示:height
xmlstarlet
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,\}"
是一个正则表达式,匹配width
或height
后跟=
双引号内的任何正整数。
关于正则表达式(以及更多)的很好的指南可以在这里找到:格利莫尔
然而,请注意,您提供的格式是 XML 等典型格式,使用 REGEX 工具处理这些格式时存在一些危险。通常应该首选匹配的解析器。