我需要从多个文件中删除两个文本块。这两个块是:
<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>' {} \;
答案 0 :(得分:1)
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();
}