从文本文件-sed中的每一行中删除前两个char

时间:2016-04-08 15:33:03

标签: php bash sed

我正在使用执行sed:

的PHP文件
shell_exec("C:\\cygwin64\\bin\\bash.exe --login -c 'sed -i -r \'s/.{2}//\' $text_files_path/File.txt 2>&1'");

此语句将从file.txt中删除前2个字符。 如何从文件中的(每一行)删除前两个字符?

File.text:

< TTGCATGCAAAAATTT
< AAAAAAATTTTGCTGA
< AAGGTTCCCCCTTAGT

修改1:

shell_exec("C:\\cygwin64\\bin\\bash.exe --login -c 'sed -i -r 's/^..//' $text_files_path/File.txt 2>&1'");

这可行但是,它将所有行连接在一起: 上面命令后的File.text:

TTGCATGCAAAAATTTAAAAAAATTTTGCTGAAAGGTTCCCCCTTAGT

3 个答案:

答案 0 :(得分:0)

如果您只是想使用PHP,那么您可以explode()将文件分成单独的行,然后使用substr()删除前两个字符,然后再将这些行重新连接成一个用a分隔的单个字符串新行:

// Set the results array.
$result = array();

// Split the file into lines.
$file = $text_files_path . '/File.txt';
$lines = explode("\n", $file);

// Cut the first two characters of each line and add to the results array.
foreach($lines AS $line) {
    $result[] = substr($line, 2);
}

// Split the result back into lines.
$result = implode("\n", $result);

答案 1 :(得分:0)

s/^..//这应该可以为您提供所需的结果。

^指向该行的开头,然后.将匹配任何字符

答案 2 :(得分:0)

请不要通过bash调用sed来执行PHP本身可以执行的操作。这是一个完整的反模式。令人担忧的是,我最近在另一个问题上看到了完全相同的事情......

我希望你有足够的可用磁盘空间:

$input_filename = "$text_files_path/File.txt";
$output_filename = 'path/to/temp/output.txt';

$input_file = fopen($input_filename, 'rb');
$output_file = fopen($output_filename, 'wb');

while (($line = fgets($input_file)) !== false) {
    fwrite($output_file, substr($line, 2));
}

fclose($input_file);
fclose($output_file);

rename($output_filename, $input_filename);

打开输入文件进行读取,打开临时输出文件进行写入。在这两种情况下都使用二进制模式,以避免与不同系统上不同行结尾相关的问题。

读取输入的每一行,并将第二个字符的子字符串写入临时输出。

关闭两个文件,然后用临时文件覆盖输入。

从技术上讲,这实际上可以就地实现,但是生成的脚本会复杂得多,如果出现问题,你可能会进一步损坏输入文件。