Даже в качестве фиксированной строки 1.
будет соответствовать 11.
. Но это не строка, это регулярное выражение, поэтому к определенным символам применяются правила, а не литералы соответствия.
Точка является заменой -для " любого символа "; чтобы соответствовать буквальной точке, вам нужно экранировать ее как \.
. Вы также можете включить маркер для начала -строки -(символ вставки ^
), чтобы 1.
совпадал только в начале строки.
Вы также можете отказаться от cat
, потому чтоgrep
(и многие другие команды )напрямую принимают имя файла.
Затем вы получите что-то вроде этого
grep '^1\.' test
который в вашем наборе данных соответствует только одной строке
1. Lil Nas X Ft, Billy Ray Cyrus - Old Town Road (Remix).mp3
Использованиеsed
:
sed -E 's/(.*):([^,]*\.jks)(,.*)/\1\3, \2/' infile
Все, что находится внутри (...)
, известно как захваченная группа, и они берут обратную -ссылку, например \1
для первой группы, \2
для второй,... (только до максимума \9
).
:
соответствует буквальному:
[^,]*
соответствует любому символу, кроме запятой; \.jks
соответствует буквальной точке .
, за которой следуетjks
:[^,]*\.jks,
соответствует двоеточию, за которым следует все, что заканчивается на .jks
и запятая; мы хотим, чтобы эта часть ([^,]*\.jks)
двигалась последней, поэтому мы окружили ее внутри (...)
; двоеточие :
мы удалим, поэтому мы оставили его за пределами захваченных групп.
Внешние захваченные группы захватывают все (.*)
вокруг захваченной группы; первый доступен с \1
"(.*)
", второй с \2
"([^,]*\.jks)
" и третий \3
"(,.*)
".
Протестировано в GNU awk
.
split()
сначала введите поле в массив a
, а затем переназначьте $1
значения a[1]
и a[2]
и создайте $5
со значением a[3]
. awk -F, '{split($1,a,":",sep);$1=a[1]sep[1]a[2]; $5=a[3]; print $0}' OFS=',' file
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile31242.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile3222242.jks