Удаление первого ^ M из каждой строки файла

Похоже, ваш VPN-клиент Strongswan находится за брандмауэром или NAT устройство, которое после некоторого времени бездействия разрывает «соединение» (здесь, вероятно, UDP, термин «соединение» - не лучший выбор). Любые входящие данные, принадлежащие этому соединению, затем считаются недействительными и отбрасываются (у вас может быть строка об этом в журналах вашего устройства FW / NAT). Позже, когда вы пингуете Google изнутри, ваше соединение восстанавливается, и ваш брандмауэр / устройство NAT теперь снова считает входящие данные действительными.

Решение состоит в том, чтобы предотвратить прерывание «соединения» вашим брандмауэром / устройством NAT, обеспечив регулярный поток данных (одного сообщения UDP каждую минуту может быть достаточно). Найдите любой механизм поддержания активности, встроенный в Strongswan, и активируйте его.

2
01.08.2016, 21:11
6 ответов

Чтобы удалить 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
0
27.01.2020, 21:49

Вот один из вариантов использования sed:

sed -i.bak '2,$s/\r//' filename

Что он делает:

  1. -i.bak добавляет резервную копию исходного файла как имя_файла.bak.
  2. 2,$ начинается со второй строки и продолжается до конца файла.
  3. 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$
2
27.01.2020, 21:49

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

8
27.01.2020, 21:49

Вот что вы можете сделать, используя 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 , выбор за вами.

1
27.01.2020, 21:49

(Исходя из того факта, что на вашем изображении ^ 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, или нет?)

2
27.01.2020, 21:49

Чтобы ответить на вопрос в теме: удалите все остальные символы CR в файле с помощью GNU awk :

awk -v RS='\r' '{ORS = NR % 2 ? RT : ""; print}' < infile > outfile

It устанавливает разделитель (входной) записи на CR и устанавливает разделитель выходной записи на RT (признак конца записи для этой записи, который может быть CR или ничего, если это последняя запись и вход не заканчивается символом CR) только для четные записи (когда NR% 2! = 0 ).

1
27.01.2020, 21:49

Теги

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