2

複数のファイルから 2 つのテキスト ブロックを削除する必要があります。2 つのブロックは次のとおりです。

<sales_end_date>None</sales_end_date>
 ... some text
<unavailable_for_vod_date>None</unavailable_for_vod_date>

次のように適切に行うにはどうすればよいですか。

find ./ -type f -name 'xml' -exec sed -i 
    '**remove <sales_end_date>None</sales_end_date>' {} \;
4

6 に答える 6

1

私はあなたが探していると思います:

find . -type f -name '*.xml' -exec sed -i \
    -e '\@^<sales_end_date>None</sales_end_date>@d' \
    -e '\@^<unavailable_for_vod_date>None</unavailable_for_vod_date>@d' {} \;

しかし、私はこれを適切に行っているとは呼びません。sed への-iオプションは、間違いなくまったく使用するのに適切ではなく、sed を使用して xml を解析することは、当然のことながら忌まわしいと見なされます。ただし、これでうまくいくはずです。

于 2012-08-14T23:26:48.080 に答える
1

XMLStarlet の使用:

xml ed -d "*/sales_end_date[text()='None']" -d "*/unavailable_for_vod_date[text()='None']" your-input.xml

例: xml が次のようになっているとします。

<here>
  <top_level>
    <something>1</something>
    <sales_end_date>None</sales_end_date>
    <unavailable_for_vod_date>None</unavailable_for_vod_date>
  </top_level>
</here>

出力します:

<here>
  <top_level>
    <something>1</something>
  </top_level>
</here>
于 2012-08-16T01:05:47.733 に答える
0

私は bash コマンド シェルを持っていないので、今はこれをテストできませんが、sed 's/before/after/g'探しているものの基盤です。私はしばしばこれを少しの配管で行いました

#!/bin/bash
before_string1='<sales_end_date>None</sales_end_date>'
after_string1=''
before_string2='<unavailable_for_vod_date>None</unavailable_for_vod_date>'
for file in `find ./ -type f -name 'xml'`; do
    cat ${file} | sed "s/$before_string1/${after_string1}/g" > ${file}.tmp1
    cat ${file}.tmp1 | sed "s/$before_string2/${after_string2}/g" > ${file}.tmp2
    mv ${file.tmp2} ${file}
    rm -f ${file.tmp1}
done

前または後の文字列が使用されていないことを確認する/必要があります。そうしないと、それらをエスケープする必要がありますが、そのためのbashスクリプトとsedスキルがあると確信しています。

于 2012-08-14T23:19:00.900 に答える
0

運が良ければ、これを試してください:

find -type f -name '*.xml' -exec sh -c \
    'grep -v "<sales_end_date>None</sales_end_date>" "{}" >/tmp/a; mv /tmp/a "{}"' \;

注意: このコマンドは、行内の一部の文字ではなく、行全体を削除する場合にのみ役立ちます。

ちょっとしたヘルパー スクリプトprocess.shを作成して、作業を楽にすることができます。

#!/bin/bash
file="$1"
shift
tmp=`tempfile`
"$@" "$file" > $tmp
mv $tmp > "$file"

その後、

find -type f -name "*.xml" -exec process.sh {} grep -v "<sales_end_date>None</sales_end_date>" \;
于 2012-08-16T01:40:50.480 に答える
0

C# で複数のファイルからコード ブロックを削除する

複数のファイルからコードのブロックを削除する必要がありました。コア プロジェクトでスウェーデン語の文字に問題があったため、System.Text.CodePagesEncodingProvider nuget パッケージをインストールし、System.Text.Encoding.UTF8 の代わりに System.Text.Encoding.GetEncoding(1252) を使用する必要がありました。

    public static void Main(string[] args)
    {
        try
        {
            var dir = @"C:\Test";
            //Get all html and htm files
            var files = DirSearch(dir);
            foreach (var file in files)
            {
                RmCode(file);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            throw;
        }

    }

    private static void RmCode(string file)
    {
        string tempFile = Path.GetTempFileName();

        using (var sr = new StreamReader(file, Encoding.UTF8))
        using (var sw = new StreamWriter(new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite), Encoding.UTF8))
        {
            string line;

            var startOfBadCode = "<div>";
            var endOfBadCode = "</div>";
            var deleteLine = false;

            while ((line = sr.ReadLine()) != null)
            {
                if (line.Contains(startOfBadCode))
                {
                    deleteLine = true;
                }
                if (!deleteLine)
                {
                    sw.WriteLine(line);
                }

                if (line.Contains(endOfBadCode))
                {
                    deleteLine = false;
                }
            }
        }

        File.Delete(file);
        File.Move(tempFile, file);
    }

    private static List<String> DirSearch(string sDir)
    {
        List<String> files = new List<String>();
        try
        {
            foreach (string f in Directory.GetFiles(sDir))
            {
                files.Add(f);
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                files.AddRange(DirSearch(d));
            }
        }
        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }

        return files.Where(s => s.EndsWith(".htm") || s.EndsWith(".html")).ToList();
    }
于 2019-11-16T15:16:02.157 に答える
0

Noneが削除したいタグの中にある場合は、次を使用できます。

find . -name *.xml | xargs sed -ri 's/<.*?>None<.*?>//g'
于 2012-08-15T01:16:26.153 に答える