簡體   English   中英

從文本文件-sed中的每一行刪除前兩個char

[英]delete first two char from each line in text file -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個字符。 如何從文件的每一行中刪除前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

如果只想使用PHP,則可以將文件explode()分成幾行,然后使用substr()刪除前兩個字符,然后再將這些行連接回以新行分隔的單個字符串中:

// 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);

s/^..//應該可以為您提供所需的結果。

^指向行的開頭,然后指向. 將匹配任何字符

請不要通過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);

打開輸入文件進行讀取,並打開臨時輸出文件進行寫入。 在兩種情況下都使用二進制模式,以避免與不同系統上不同行尾相關的問題。

讀取輸入的每一行,並將第二個字符中的子字符串寫入臨時輸出。

關閉兩個文件,然后用臨時文件覆蓋輸入。

從技術上講,這實際上可以就地實現,但是生成的腳本會復雜得多,如果出現問題,您將有進一步破壞輸入文件的風險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM