С помощью базовых регулярных выражений вы можете использовать классы символов и обратные ссылки для выполнения своей задачи, например,
$ sed 's/\([0-9][0-9]*:[0-9][0-9]*\)[ ]\([0-9][0-9]*:[0-9][0-9]*\)/\1,\2/g' file
1/0 ./. 0/1 GT:GL:GOF:GQ:NR:NV 1:12:314,213:132:13:31,14:31:31 AB GT BB
1/0 ./. 0/1 GT:GL:GOF:GQ:NR:NV 10:13:12,41:41:1:13,13:131:1:1 AB GT RT
1/0 ./. 0/1 GT:GL:GOF:GQ:NR:NV 1:12:314,213:132:13:31,14:31:31 AB GT
Что в основном говорит:
- найти и перехватить любую
[0-9][0-9]*
одну или несколько цифр,
- разделены
:
и
- , за которым следует
[0-9][0-9]*
одна или несколько цифр - в качестве группы захвата 1,
- соответствует пробелу после группы захвата 1, за которой следует группа захвата 2 (которая совпадает с группой захвата 1),
- затем замените пространство, разделяющее группы захвата, на запятую, заново вставив текст группы захвата, используя обратные ссылки 1 и 2 (например,
\1
и \2
), наконец
- сделать замену global (например,
g
), чтобы заменить все совпадающие вхождения.
Редактирование на основе нового введенного сообщения
Если вам все еще нужно добавить все оригинальные запятые, и , то теперь вы хотите добавить запятую между ,0 0/
(где перед запятой стоит цифра, за которой следует заменить пробел с запятой, за которой следует однозначная цифра и косая черта), тогда все, что вам нужно сделать, - это сделать свои группы захвата условными (либо захват исходных данных, как указано выше, либо захват нового сегмента. включая ИЛИ (например, \|
в основных терминах регулярных выражений) между условиями.
Например, добавив \|,[0-9]
в конце первой группы захвата и \|[0-9][/]
в конце второй, например,
$ sed 's/\([0-9][0-9]*:[0-9][0-9]*\|,[0-9]\)[ ]\([0-9][0-9]*:[0-9][0-9]*\|[0-9][/]\)/\1,\2/g' file
0/1:-1,-1,-1:146:28:14,14:4,0,0/1:-1,-1,-1:134:6:2,2:1,0
Если у вас есть другие предупреждения в вашем файле, я предлагаю вам опубликовать несколько полных строк ввода, а если они слишком длинные, то создайте файл zip, gzip, bzip или xz и разместите его на сайте, таком как pastebin, и добавьте ссылка на ваш вопрос.
Если сейчас все, что вас действительно волнует, это пробел в ,0 0/
, то вы можете сократить команду sed
до:
$ sed 's/\(,[0-9]\)[[:space:]]\([0-9][/]\)/\1,\2/g' file
0/1:-1,-1,-1:146:28:14,14:4,0,0/1:-1,-1,-1:134:6:2,2:1,0
( note: Я включил [[:space:]]
для обработки любых пробелов (пробел, табуляция, ...) вместо просто литерала [ ]
(пробел) в новом примере)
Дайте мне знать, если это решит проблему.