Заменять пробелы запятыми, но не во всей строке

В документации четко написано, что если вы получаете сообщения от локальной системы, то в качестве ip вы получите 127.0.0.1.

Здесь,http://www.rsyslog.com/doc/master/configuration/properties.html

попробуйте отправить его из какой-нибудь другой системы. Меня устраивает.

Или же, если IP для вас не важен и вы просто хотите отличить хост, используйте свойство %hostname%.

7
10.10.2019, 12:52
5 ответов

Использование gsub()в awkдля последнего;-поля с разделителями:

$ awk -F ';' 'BEGIN { OFS=FS } { gsub(" ", ",", $NF); print }' file
some name;another thing; random;,value,value,value,value,value

Используя sedи предполагая, что мы хотим заменить все пробелы после последнего ;запятыми:

$ sed 'h;s/.*;//;y/ /,/;x;s/;[^;]*$//;G;s/\n/;/' file
some name;another thing; random;,value,value,value,value,value

Аннотированный sedскрипт:

h               ; # Duplicate line into hold space
s/.*;//         ; # Delete up to the last ;
y/ /,/          ; # Change space to comma in remaining data
x               ; # Swap pattern and hold spaces
s/;[^;]*$//     ; # Delete from the last ;
G               ; # Append hold space delimited by newline
s/\n/;/         ; # Replace the embedded newline with ;
                ; # (implicit print)

«Пространство хранения» представляет собой отдельный буфер хранения, который sedпредоставляет. «Пространство шаблонов» — это буфер, в который данные считываются из ввода и к которому могут быть применены модификации.

11
27.01.2020, 20:15

СGNU sed

$ s='some name;another thing; random; value value value value value'
$ echo "$s" | sed -E ':a s/^(.*random;.*) /\1,/; ta'
some name;another thing; random;,value,value,value,value,value
  • :aтабличкаa
  • s/^(.*random;.*) /\1,/здесь (.*random;.*)будет захватывать все до random;в строке ввода и столько символов, сколько необходимо, пока после этого не будет пробела, затем в разделе замены используйте обратную ссылку, чтобы сохранить захваченную строку и заменить пробел символом запятой
    • обратите внимание, что если во входных данных есть более одного random;, это сохранит пробелы только до первого вхождения
  • taперейти к метке a, если предыдущая замена прошла успешно
3
27.01.2020, 20:15

Перл спешит на помощь!

perl -F';' -ne '$F[3] =~ s/ /,/g; print join ";", @F'
  • -nсчитывает ввод построчно и обрабатывает каждую строку
  • -Fразбивает каждую строку заданного регулярного выражения на массив @F
  • =~привязывает подстановку только к четвертому элементу массива @F, т.е. после элемента после "random"
  • join объединяет элементы массива @F в выходную строку
4
27.01.2020, 20:15
$ perl -MText::CSV_XS=csv -e'csv(in=>csv(in=>"file",sep=>";",allow_whitespace=>1),sep=>";",quote_space=>0);'
some name;another thing;random;value value value value value
1
27.01.2020, 20:15
$ perl -pe 's/ (?=[^;]*$)/,/g' file
  • Для замены выбираются только те пробелы, в которых точка с запятой не видна до конца строки.
3
27.01.2020, 20:15

Теги

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