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

如果None仅在您要删除的那些标签内,则可以使用:

find . -name *.xml | xargs sed -ri 's/<.*?>None<.*?>//g'
于 2012-08-15T01:16:26.153 回答
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.GetEncoding(1252) 而不是 System.Text.Encoding.UTF8。

    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 回答