Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
Php 从以“开始”的文本文件中删除不需要的行;abc";或;fgh";_Php_Windows_Batch File_Text_Str Replace - Fatal编程技术网

Php 从以“开始”的文本文件中删除不需要的行;abc";或;fgh";

Php 从以“开始”的文本文件中删除不需要的行;abc";或;fgh";,php,windows,batch-file,text,str-replace,Php,Windows,Batch File,Text,Str Replace,所以我有一个巨大的列表,每行都有一些连续剧。我想删除所有不需要的以234和467开头的行。我想使用批处理文件来实现这一点,但如果使用php更简单,我也不会介意 072345678 072567863 234567832 467890432 072345678 我想用批处理文件删除以234和467开头的所有行,因此编辑的文本文件将保持如下状态 072345678 072567863 072345678 $text="072345678 072567863 234567832 467890432

所以我有一个巨大的列表,每行都有一些连续剧。我想删除所有不需要的以
234
467
开头的行。我想使用批处理文件来实现这一点,但如果使用php更简单,我也不会介意

072345678
072567863
234567832
467890432
072345678
我想用批处理文件删除以
234
467
开头的所有行,因此编辑的文本文件将保持如下状态

072345678
072567863
072345678
$text="072345678
072567863
234567832
467890432
072345678";
echo preg_replace('#^(234|467)([0-9]+)$#ims', '', $text);

使用findstr。它允许正则表达式(使用
/R
)。克拉(
^
)与行首匹配
/V
过滤掉匹配的行(而不是过滤掉不匹配的行)


在php中,您可以使用如下内容

072345678
072567863
072345678
$text="072345678
072567863
234567832
467890432
072345678";
echo preg_replace('#^(234|467)([0-9]+)$#ims', '', $text);

文件\u获取\u内容以包含数据,然后分解,在pregreplace上foreach和if以不添加空行,但使用shell命令更快,这很可能对您有效

$data = file("./foo.txt");
$matches = array('234', '467');
$out = array();

foreach($data AS $line) 
{
   // if not matches 234 OR 467, add to out array
   $pattern = '/^(' . implode('|', $matches) . ')/'; // $pattern = /^(234|467)/
   if(! preg_match($pattern, $string))
   {
       $out[] = $line;
   }
}

// open and lock foofile
$fp = fopen("./foo.txt", "w+");
flock($fp, LOCK_EX);

// rewrite foo with valid content line by line
foreach($out AS $line) 
{
    fwrite($fp, $line);
}
flock($fp, LOCK_UN);
fclose($fp);  
如果要对许多文件执行此操作,也可以将其转换为函数

function replaceFileData(array $filesList, array $matches)
{
    foreach ($filesList AS $file)
    {
        if (file_exists($file) && ! empty($matches))
        {
            $data = file($file)
            $out  = array();

            foreach($data AS $line) 
            {
               // if not matches 234 OR 467, add to out array
               $pattern = '/^(' . implode('|', $matches) . ')/'; // $pattern = /^(234|467)/
               if(! preg_match($pattern, $string))
               {
                    $out[] = $line;

                    $fp = fopen($file, "w+");
                    flock($fp, LOCK_EX);
                    foreach($out AS $line) 
                    {
                        fwrite($fp, $line);
                    }
                    flock($fp, LOCK_UN);
                    fclose($fp);
               }
            }
        }
    }
}


replaceFileData(array('foo.txt', 'bar.txt'), array(234, 567));

有很多解决方案,看看以前的帖子:

在批处理中,您可以这样做:

@echo off
setlocal enableDelayedExpansion

for /f "tokens=*" %%i in (input.txt) do (
    set line=%%i
    set line=!line:~0,3!
    if !line! NEQ 234 (
        if !line! NEQ 467 (
            echo %%i >>out.txt
        )
    )
)

请分享您尝试过的内容。我尝试过使用它,但它不起作用。ren myFile.txt myFile.txt.old findstr/v/b/c:“blabla”myFile.txt.old>myFile.txt
@echo off
setlocal enableDelayedExpansion

for /f "tokens=*" %%i in (input.txt) do (
    set line=%%i
    set line=!line:~0,3!
    if !line! NEQ 234 (
        if !line! NEQ 467 (
            echo %%i >>out.txt
        )
    )
)