Удалить используя другой разделитель с Sed

Я очень опаздываю на вечеринку, но я расскажу об этом здесь, если кто-нибудь еще захочет узнать мое решение:

У меня была настоящая борьба с этой точной проблемой, но я нашел жизнеспособную

У меня была 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 никогда не распознает сценарий загрузки как «загруженный». Я знаю, что это может не обязательно обнаруживать, когда браузер получает файл, но ваша проблема была похожа на мою.

23
задан jww 28 April 2018 в 11:07
поделиться

4 ответа

Разделители //, которые вы используете, не для команды 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).

36
ответ дан Benjamin W. 28 April 2018 в 11:07
поделиться

использовать gawk

gawk '!/timebomb/' file > newfile
0
ответ дан ghostdog74 28 April 2018 в 11:07
поделиться

вы можете просто использовать оболочку, не нужно внешних инструментов

while read -r line
do 
    case "$line" in
        *timebomb* ) continue;;
        *) echo "$line";;
    esac        
done <"file"
0
ответ дан ghostdog74 28 April 2018 в 11:07
поделиться

Двоеточие предшествует метке в sed, поэтому ваша программа sed выглядит как пара меток, в которых ничего не происходит. Синтаксический анализатор может видеть двоеточия как разделители, если им предшествует команда s, так что это особый случай.

1
ответ дан 28 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: