Я очень опаздываю на вечеринку, но я расскажу об этом здесь, если кто-нибудь еще захочет узнать мое решение:
У меня была настоящая борьба с этой точной проблемой, но я нашел жизнеспособную
У меня была html-страница, которая запустила отдельный php-скрипт, который сгенерировал файл, а затем загрузил его. На html-странице я использовал следующий jquery в заголовке html (вам также нужно включить библиотеку jquery):
<script>
$(function(){
var iframe = $("<iframe>", {name: 'iframe', id: 'iframe',}).appendTo("body").hide();
$('#click').on('click', function(){
$('#iframe').attr('src', 'your_download_script.php');
});
$('iframe').load(function(){
$('#iframe').attr('src', 'your_download_script.php?download=yes'); <!--on first iframe load, run script again but download file instead-->
$('#iframe').unbind(); <!--unbinds the iframe. Helps prevent against infinite recursion if the script returns valid html (such as echoing out exceptions) -->
});
});
</script>
На вашем_download_script.php есть следующее:
function downloadFile($file_path) {
if (file_exists($file_path)) {
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=' . basename($file_path));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
ob_clean();
flush();
readfile($file_path);
exit();
}
}
$_SESSION['your_file'] = path_to_file; //this is just how I chose to store the filepath
if (isset($_REQUEST['download']) && $_REQUEST['download'] == 'yes') {
downloadFile($_SESSION['your_file']);
} else {
*execute logic to create the file*
}
Чтобы прервать это, jquery сначала запускает ваш php-скрипт в iframe. Iframe загружается после создания файла. Затем jquery снова запускает скрипт с переменной запроса, сообщающей скрипту для загрузки файла.
Причина, по которой вы не можете выполнить загрузку и создание файлов за один раз, связана с заголовком php () функция. Если вы используете header (), вы меняете скрипт на что-то другое, кроме веб-страницы, и jquery никогда не распознает сценарий загрузки как «загруженный». Я знаю, что это может не обязательно обнаруживать, когда браузер получает файл, но ваша проблема была похожа на мою.
Разделители //
, которые вы используете, не для команды d
, а для адресации. Я думаю, вы сравниваете их с косыми чертами в команде s///
... Однако, хотя оба они относятся к регулярным выражениям, они имеют разные контексты.
Адрес (который появляется до команды) фильтрует строки, к которым применяется команда ... Опции (которые появляются после команды) используются для управления заменой применяется.
Если вы хотите использовать разные разделители для регулярного выражения в адресе, вам нужно начинать адрес с обратной косой черты:
$ sed '\:timebomb:d' test.txt
01 30 * * * /opt/reincarnate.sh >> reincarnation.log
(Чтобы понять разницу между адресом и параметрами, рассмотрите выходные данные команды:
$ sed '/timebomb/s/log/txt/' test.txt
Адрес выбирает только строку (и), содержащую регулярное выражение timebomb
, но опции сообщают команде s
заменить регулярное выражение log
на txt
).
использовать gawk
gawk '!/timebomb/' file > newfile
вы можете просто использовать оболочку, не нужно внешних инструментов
while read -r line
do
case "$line" in
*timebomb* ) continue;;
*) echo "$line";;
esac
done <"file"
Двоеточие предшествует метке в sed, поэтому ваша программа sed выглядит как пара меток, в которых ничего не происходит. Синтаксический анализатор может видеть двоеточия как разделители, если им предшествует команда s, так что это особый случай.