Вычислить большой файл с символами ^H и ^M

У меня это работало на Puppy Linux Xenial x64:

https://nordvpn.com/tutorials/ipfire/openvpn/

Примечание :Если VPN не может запуститься для вас и вы получаете этот вывод:

ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)

Затем сделайте следующее:

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun
cat /dev/net/tun

Если вы получили сообщение:

cat: /dev/net/tun: File descriptor in bad state

Это означает, что ваше устройство TUN/TAP готово к использованию.

5
13.08.2021, 14:33
2 ответа

Публикую это как ответ для ясности.

Как указал rowboat , в этом случае команда awk -F '\r' '{print $NF}' fileработает как задумано, удаляя все после последнего возврата каретки. Хотя это ненадежно, как указал zevzek .

Ниже я написал более надежное решение на C++.

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

string filter_string(string line, const char *bspace, const char *creturn){

    string new_str;

    for(string::size_type i = 0; i < line.size(); ++i) {
        // Step back if current string not empty
        if (line[i] == *bspace){
            if (new_str.size() != 0){
                new_str.pop_back();
            };
        // Reset on carriage return
        } else if (line[i] == *creturn){
            new_str = "";
        } else {
            new_str += line[i];
        };
    }

    return new_str;
};

int main(int argc, char* argv[]){
    const char backspace = '\x08';
    const char creturn = '\r';

    if (argc != 2){
        cerr << "USAGE: " << argv[0] << " [src]" << endl;
        return 1;
    }

    // Filter lines in file
    string line;
    ifstream infile(argv[1]);
    while (getline(infile, line)){
        cout << filter_string(line, &backspace, &creturn) << endl;
    };

    return 0;
};

Здесь повторяется каждый символ в каждой строке, и если присутствует ^H, строка отодвигается на один (, если она еще не пуста ), и если присутствует ^Mвозврат каретки, то строка сбрасывается. Вывод отправляется на stdout, который затем может быть передан в файл.

4
23.08.2021, 20:35

sed 's/.*\x0d//' logfile

Кажется, он делает то, о чем вы просите.

Обратите внимание, что col -bзавершается ошибкой, потому что игнорируются пробелы.:

$ echo $'--------\r1st try\r2nd   \r3rd\n' | col -b
3rd-try-
2
23.08.2021, 21:38

Теги

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