Похоже, ваш VPN-клиент Strongswan находится за брандмауэром или NAT устройство, которое после некоторого времени бездействия разрывает «соединение» (здесь, вероятно, UDP, термин «соединение» - не лучший выбор). Любые входящие данные, принадлежащие этому соединению, затем считаются недействительными и отбрасываются (у вас может быть строка об этом в журналах вашего устройства FW / NAT). Позже, когда вы пингуете Google изнутри, ваше соединение восстанавливается, и ваш брандмауэр / устройство NAT теперь снова считает входящие данные действительными.
Решение состоит в том, чтобы предотвратить прерывание «соединения» вашим брандмауэром / устройством NAT, обеспечив регулярный поток данных (одного сообщения UDP каждую минуту может быть достаточно). Найдите любой механизм поддержания активности, встроенный в Strongswan, и активируйте его.
Чтобы удалить CR не в конце строки с помощью sed
, вы можете сделать:
CR=$(printf '\r')
sed -e :1 -e "s/$CR\(.\)/\1/g;t1" < infile > outfile
Или, поскольку вы в Ubuntu, где sed
- это GNU sed
:
sed -E ':1;s/\r(.)/\1/g;t1' < infile > outfile
Он ищет CR, за которым следует символ (что происходит для всех CR, кроме тех, которые находятся в конце строки), и заменяет их этим персонажем (записано в \ 1
). Он делает это многократно в цикле для учета последовательных CR.
Теперь это только для импорта в программное обеспечение Unix, вы также можете удалить все CR, так что вы получите текстовый файл в формате Unix (окончание строк CRLF только для ОС Microsoft, вам очень повезло, что это программное обеспечение в первую очередь понимает строки с завершением CRLF):
tr -d '\r' < infile > outfile
Вот один из вариантов использования sed
:
sed -i.bak '2,$s/\r//' filename
Что он делает:
-i.bak
добавляет резервную копию исходного файла как имя_файла.bak
. 2,$
начинается со второй строки и продолжается до конца файла. s/r//
удаляет первое вхождение возврата каретки (^M на снимке экрана) в каждой строке. Пример команды с использованием размещенного отрывка, где я вручную ввел возврат каретки в vi:
$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M$
$ sed -i.bak '2,$s/\r//' test_sed
$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W,,,"Direct",3797,2241,4091^M$
Предполагая, что вы хотите сохранить файл в формате DOS (окончания строк CRLF), мы можем обмануть; удалите все CR, а затем снова добавьте их в конец строки.
Итак,
tr -d '\015' < srcfile | unix2dos > newfile
РЕДАКТИРОВАТЬ для подробного описания:
tr -d '\015'
удалит все символы control-M из файла. -d
- tr
означает «удалить», а '\ 015'
- это управляющий символ-M в восьмеричном формате.
unix2dos
преобразует любые символы LF (перевод строки; control-J;) в CRLF путем вставки CR (control-M) перед символом LF; это преобразует текстовый файл формата unix в текстовый файл формата DOS.
Соедините эти два, и мы удалим все мошеннические ^ M и убедитесь, что единственные находятся в конце каждой строки.
Вот что вы можете сделать, используя SED в версиях GNU
и BSD
, чтобы удалить первое вхождение чего-либо:
sed '2,/RE/s/\^M//' yourFile
И вот что вы можете сделать, чтобы удалить второе - или n-е - вхождение:
sed '2,/RE/s/\^M//2' yourFile
# Первое - это то же, что sed '2, / RE / s / \ ^ M // 1' yourFile
NB / RE /
остановит замену, если какая-то строка содержит RE
. Вы можете заполнить его чем угодно. ИЛИ вы можете просто использовать sed '2, $ s / \ ^ M //' yourFile
, выбор за вами.
(Исходя из того факта, что на вашем изображении ^ M
отображается синим цветом, а не обычным белым, я полагаю, вы имеете в виду символ возврата каретки (CR), а не буквальная комбинация каретки + M. (Да, это тот случай, когда размещение текста в виде изображения действительно может быть полезно.))
1) Поскольку вы вводите данные в LibreOffice, вы могли видеть, будет ли он правильно обрабатывать переводы строки в стиле Unix (только LF вместо CRLF) и просто полностью удалить все возвраты каретки:
tr -d '\r' < input > output
2) Если вы хотите сохранить окончания строк CRLF в стиле DOS и просто удалите CR: s в середине строки (т.е.не сразу после LF), вы можете сделать это в Perl:
perl -pe 's/\r(?!\n)//g' < input > output
s / xxx / yyy / g
заменяет все вхождения xxx
на yyy
, \ r
интерпретируется как символ возврата каретки, а (?! \ n)
означает «без \ n
», где \ n
это символ новой строки / перевода строки. Замена пуста, поэтому спички удаляются.
Вы можете сделать что-то подобное с sed
, но escape-последовательность \ r
поддерживается не во всех версиях sed
, и ввод Символ ctrl-M
буквально в командной строке несколько утомляет. (В Ubuntu есть GNU sed, которая поддерживает его, но также есть Perl, поэтому.)
Я специально проигнорировал все, что вы сказали о первом появлении в каждой строке и об игнорировании первой строки, так как я считаю ее немного хрупкой. полагаться на то, что вход всегда содержит точно правильное количество ложных дополнительных управляющих символов. (Что, если в какой-то строке есть два ^ M
: s, или нет?)
Чтобы ответить на вопрос в теме: удалите все остальные символы CR в файле с помощью GNU awk
:
awk -v RS='\r' '{ORS = NR % 2 ? RT : ""; print}' < infile > outfile
It устанавливает разделитель (входной) записи на CR и устанавливает разделитель выходной записи на RT (признак конца записи для этой записи, который может быть CR или ничего, если это последняя запись и вход не заканчивается символом CR) только для четные записи (когда NR% 2! = 0
).