Как убрать пробел после первого рисунка в седе - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть файл

file.txt

Name-6.1.4_Float Time;453802;464204;466345 464481 466131  464283  465065 462561
Name-6.1.4_Logic Good Time;125896;145349;137303 131601  144520 132487  133884

Я хочу заменить пробелы между числовым значением на ; после первой точки с запятой ; Пробелы междучисловое значение может иметь более одного пробела.Также выше Name_Float Time может быть что угодно.

Ожидаемый вывод:

Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;

Вот что я пробовал:

sed 's/ /;/g;s/;;/;/g;s/$/;/g' file.txt

Вывод:

Name-6.1.4_Float;Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic;Good;Time;125896;145349;137303;131601;144520;132487;133884;

В приведенном выше выводе пробелы между Именем также заменяются на ;.Подскажите, пожалуйста, как избежать пробелов между именами, которые будут заменены на ;.Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы можете использовать

sed -E ':a;s/(;[^ \t]+)[ \t]+/\1;/;ta' file 

См. онлайн-демонстрацию

Подробнее

  • :a;- метка
  • s/(;[^ \t]+)[ \t]+/\1;:
    • (;[^ \t]+) - найти и захватить в группу 1 ...
      • ; - ; char
      • [^ \t]+ - один или несколько символов, отличных от пробела и табуляции
    • [ \t]+ - 1 или более пробелов или символов табуляции сопоставляются без захвата
  • \1; - и замените содержимое группы 1 + точку с запятой после него
  • ta - зацикливайтесь на :a, если на совпадениипредыдущая итерация.
0 голосов
/ 26 февраля 2019

С Procedural Text Edit вы можете сделать это так:

forEach line {
    select (after ci ";") {
        findReplaceAll ci " " ";"
        removeDupeAdjacent ";"
    }
}
0 голосов
/ 26 февраля 2019

Вы можете использовать это awk решение:

awk 'BEGIN{FS=OFS=";"} {s=$1; $1=""; gsub(/[[:blank:]]+/, OFS); $0= s $0 OFS} 1' file

Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;

Или вы можете использовать perl с поддержкой \G

perl -pe 's/(^[^;]*|\G)[;\h]*(\b\d+|$)/$1;$2/g' file

Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;

Демонстрация и подробности RegEx

\G устанавливает положение в конце предыдущего совпадения или в начале строкиза первый матч

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...