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>

...その後、次のように、属性を含む各ドキュメントノードから属性を削除できますwidthheightxmlstarlet

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\}- それぞれ0または無限大を表すためにmまたはnを使用せずに前のパターンを繰り返します。

=>は二重引用符内の正の整数と一致するか、それに続く正規\(width\|height\)="[0-9]\{1,\}"表現です。widthheight=

正規表現(およびその他)の便利なガイドはここにあります。グリモア

しかし、、提供する形式はXMLなどの一般的な形式であり、REGEXツールを使用してこれらの形式を処理する際にいくつかのリスクがあることに注意してください。一般に、一致するパーサが好ましい。

関連情報