Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用perl、sed或awk(同一行和不同行中的标记都是混合的)从大型多行文件中剪切包含内容的html标记?_Regex_Perl_Awk_Sed - Fatal编程技术网

Regex 如何使用perl、sed或awk(同一行和不同行中的标记都是混合的)从大型多行文件中剪切包含内容的html标记?

Regex 如何使用perl、sed或awk(同一行和不同行中的标记都是混合的)从大型多行文件中剪切包含内容的html标记?,regex,perl,awk,sed,Regex,Perl,Awk,Sed,我正在尝试从*?清除文件。在一行中完成很容易,但是如何在多行中完成呢?一行中的哪一行可以有更多或更少的标记 我为维基百科准备了一些测试文本,以显示问题: : <math>A = \begin{bmatrix} a_{1,1} & a_{1,2} & \dots \\ a_{2,1} & a_{2,2} & \dots \\ \vdots & \vdots & \ddots \end{bmatrix} </mat

我正在尝试从
*?
清除文件。在一行中完成很容易,但是如何在多行中完成呢?一行中的哪一行可以有更多或更少的标记

我为维基百科准备了一些测试文本,以显示问题:

: <math>A = 
\begin{bmatrix}
   a_{1,1} & a_{1,2} & \dots \\
   a_{2,1} & a_{2,2} & \dots \\
   \vdots & \vdots & \ddots
\end{bmatrix}
</math> oraz <math>B = 
\begin{bmatrix}
   b_{1,1} & b_{1,2} & \dots \\
   b_{2,1} & b_{2,2} & \dots \\
   \vdots & \vdots & \ddots
\end{bmatrix}
=
\begin{bmatrix}
   B_1 \\
   B_2 \\
   \vdots
\end{bmatrix}
</math>,
:A=
\开始{bmatrix}
a{1,1}&a{1,2}&\dots\\
a{2,1}&a{2,2}&\dots\\
\vdots&\vdots&\ddots
\结束{bmatrix}
oraz B=
\开始{bmatrix}
b{1,1}&b{1,2}&\dots\\
b{2,1}&b{2,2}&\dots\\
\vdots&\vdots&\ddots
\结束{bmatrix}
=
\开始{bmatrix}
B_1\\
B_2\\
\VDOT
\结束{bmatrix}
,
我们讨论了Stackoverflow的问题,得到了很好的解决方案,但如果行中包含重叠的标记,如
oraz
,则不起作用。这是正确的,因为我们有pair,但它不起作用

我不是awk、sed和perl方面的专家——我只非常熟悉正则表达式

Perl建议(不适用于此示例):

cat dirt-math-2.txt | perl-wlne'
除非((/./././)| | 0)>1{s//;print}
|少
Awk建议(不适用于此示例):

cat dirt-math-2.txt | awk'
子(/.*/,“”){print;cut=1}
//{cut=0;next}
!减少
要解析的文件是完整的波兰语维基百科,因此需要在不将6Gb加载到内存的情况下对其进行解析。提前感谢您的建议。我以前问过一些类似的问题,但不一样。

sed的一种方式:

sed -r ':a;/<math>/{:b;s!<math>([^<]|<[^/]|</[^m]|</m[^a]|</ma[^t]|</mat[^h]|</math[^>])*</math>!!g;ta;N;bb;}' file
sed-r:a//{:b;s!([^sed的一种方式:

sed -r ':a;/<math>/{:b;s!<math>([^<]|<[^/]|</[^m]|</m[^a]|</ma[^t]|</mat[^h]|</math[^>])*</math>!!g;ta;N;bb;}' file
sed-r':a;//{:b;s!([^sed的一种方式:

sed -r ':a;/<math>/{:b;s!<math>([^<]|<[^/]|</[^m]|</m[^a]|</ma[^t]|</mat[^h]|</math[^>])*</math>!!g;ta;N;bb;}' file
sed-r':a;//{:b;s!([^sed的一种方式:

sed -r ':a;/<math>/{:b;s!<math>([^<]|<[^/]|</[^m]|</m[^a]|</ma[^t]|</mat[^h]|</math[^>])*</math>!!g;ta;N;bb;}' file

sed-r:a;//{:b;s(这里有一个Perl解决方案。它的工作原理是将文件中的行累积到一个缓冲区
$text
,然后删除所有
..
对。如果生成的缓冲区没有打开的
标记,则打印并清空。这样,文件中的文本将只存储在内存中,直到没有未配对的
标记为止,并且通常它只包含一行输入

该程序希望输入文件的路径作为命令行上的参数。它已经根据您在本节和之前的问题中的示例数据进行了测试,运行良好

use strict;
use warnings;

my $text;

while ( <> ) {

    $text .= $_;

    $text =~ s/<math>.*?<\/math>//sg;

    if ( $text !~ /<math>/ ) {
        print $text;
        $text = '';
    }
}
使用严格;
使用警告;
我的$text;
而(){
$text.=$\uux;
$text=~s/*?///sg;
如果($text!~//){
打印$text;
$text='';
}
}

这里有一个Perl解决方案。它的工作原理是将文件中的行累积到一个缓冲区
$text
,然后删除所有
..
对。如果生成的缓冲区没有打开的
标记,则打印并清空。这样,文件中的文本将只存储在内存中,直到没有未配对的
标记为止,通常只包含一行输入

该程序希望输入文件的路径作为命令行上的参数。它已经根据您在本节和之前的问题中的示例数据进行了测试,运行良好

use strict;
use warnings;

my $text;

while ( <> ) {

    $text .= $_;

    $text =~ s/<math>.*?<\/math>//sg;

    if ( $text !~ /<math>/ ) {
        print $text;
        $text = '';
    }
}
使用严格;
使用警告;
我的$text;
而(){
$text.=$\uux;
$text=~s/*?///sg;
如果($text!~//){
打印$text;
$text='';
}
}

这里有一个Perl解决方案。它的工作原理是将文件中的行累积到一个缓冲区
$text
,然后删除所有
..
对。如果生成的缓冲区没有打开的
标记,则打印并清空。这样,文件中的文本将只存储在内存中,直到没有未配对的
标记为止,通常只包含一行输入

该程序希望输入文件的路径作为命令行上的参数。它已经根据您在本节和之前的问题中的示例数据进行了测试,运行良好

use strict;
use warnings;

my $text;

while ( <> ) {

    $text .= $_;

    $text =~ s/<math>.*?<\/math>//sg;

    if ( $text !~ /<math>/ ) {
        print $text;
        $text = '';
    }
}
使用严格;
使用警告;
我的$text;
而(){
$text.=$\uux;
$text=~s/*?///sg;
如果($text!~//){
打印$text;
$text='';
}
}

这里有一个Perl解决方案。它的工作原理是将文件中的行累积到一个缓冲区
$text
,然后删除所有
..
对。如果生成的缓冲区没有打开的
标记,则打印并清空。这样,文件中的文本将只存储在内存中,直到没有未配对的
标记为止,通常只包含一行输入

该程序希望输入文件的路径作为命令行上的参数。它已经根据您在本节和之前的问题中的示例数据进行了测试,运行良好

use strict;
use warnings;

my $text;

while ( <> ) {

    $text .= $_;

    $text =~ s/<math>.*?<\/math>//sg;

    if ( $text !~ /<math>/ ) {
        print $text;
        $text = '';
    }
}
使用严格;
使用警告;
我的$text;
而(){
$text.=$\uux;
$text=~s/*?///sg;
如果($text!~//){
打印$text;
$text='';
}
}

已在中回答。@melpomene您是否对该问题的测试数据进行了测试。它现在可以在6Gb Mediawiki文件上运行,无法加载整个文件,也不允许加载。我测试了您的答案,它适用于小文件。
-0777
导致
内存不足!
。顺便说一句,我不会再问类似的问题。您忽略了吗我回答的第二部分?我是指不使用
-0777
的部分。我会再试一次,也许第二部分有效,但我想我已经检查过了。你可以在这个…-
wget上测试http://dumps.wikimedia.org/plwiki/latest/plwiki-latest-pages-articles.xml.bz2
bzip2-c-d plwiki-latest-pages-articles.xml.bz2 | perl'什么的“
我将对其进行测试。已在中回答。@melpomene您是否对该问题的测试数据进行了测试。它现在可以在6Gb Mediawiki文件上运行,无法加载整个文件,也不允许加载。我测试了您的答案,这对小文件很好。
-0777
导致
内存不足!
。顺便说一句,我不会再问类似的问题了选项。你忽略了我答案的第二部分吗?我的意思是不使用
-0777
的那部分。我会再试一次,也许第二部分有效,但我想我被选中了。你可以在