如何删除多个文件中的文本块

时间:2012-08-14 23:10:15

标签: regex linux unix sed find

我需要从多个文件中删除两个文本块。这两个块是:

<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>' {} \;

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我现在无法测试,因为我没有bash命令shell,但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技能。< / p>

答案 2 :(得分:0)

我认为你在寻找:

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被认为是令人厌恶的。但是,这应该可以胜任。

答案 3 :(得分:0)

如果仅在您要删除的那些代码中,则可以使用:

find . -name *.xml | xargs sed -ri 's/<.*?>None<.*?>//g'

答案 4 :(得分: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>" \;

答案 5 :(得分: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();
    }