我正在使用执行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
答案 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);
打开输入文件进行读取,打开临时输出文件进行写入。在这两种情况下都使用二进制模式,以避免与不同系统上不同行结尾相关的问题。
读取输入的每一行,并将第二个字符的子字符串写入临时输出。
关闭两个文件,然后用临时文件覆盖输入。
从技术上讲,这实际上可以就地实现,但是生成的脚本会复杂得多,如果出现问题,你可能会进一步损坏输入文件。