Заменить строку собственным содержимым в bash - PullRequest
0 голосов
/ 18 мая 2019

Имеется большой файл (~ 1.000.000 строк) в следующем формате:

1.xml:LINK-ID-12$LANG,LINK-ID-242$LANG,____de-DE
2.xml:LINK-ID-323$LANG,LINK-ID-122$LANG,____en-GB

После обработки результат должен быть

1.xml:LINK-ID-12#de-DE,LINK-ID-242#de-DE
2.xml:LINK-ID-#en-GB,LINK-ID-122#en-GB

Последний элемент в строке всегда содержит язык. Формат этого элемента может быть выбран произвольно, для демонстрационных целей это ____<LANG>.

Заполнитель для замены на язык $LANG также можно выбрать.

Удаление последней записи в массиве не имеет большого значения, я действительно ищу решение для замены ..

Если возможно, я ищу решение, которое не требует bash для итерации по всему файлу, возможно что-то с awk / sed / grep (из-за скорости)

Ответы [ 2 ]

0 голосов
/ 18 мая 2019
$ awk 'BEGIN{FS=OFS=","} {sub(/^_+/,"#",$3); gsub(/\$LANG/,$3); print $1, $2}' file
1.xml:LINK-ID-12#de-DE,LINK-ID-242#de-DE
2.xml:LINK-ID-323#en-GB,LINK-ID-122#en-GB
0 голосов
/ 18 мая 2019

Если приемлем Perl-решение:

perl -pe 's/,____([^,]+)$// or next; my $x = $1; s/\$LANG\b/#$x/g'

Если вы можете изменить ввод, чтобы в последнем поле не было этих четырех подчеркиваний, это немного упростило бы код (просто удалите ____ из первого регулярного выражения).

Идея:

Для каждой строки ввода сопоставьте последнее поле (запятую, за которой следуют четыре символа подчеркивания, за которыми следует один или несколько не запятых, а затем конец строки) и удалите его (ничего не заменяя). Если эта замена не удалась, оставьте строку без изменений и перейдите к следующей строке.

Если замена прошла успешно, запишите содержимое удаленного поля (за вычетом четырех начальных подчеркиваний) в $1 и скопируйте значение в $x для следующей замены.

Затем снова просмотрите оставшуюся строку и замените каждое вхождение $LANG как слово (т.е. не $LANGS или $LANGUAGE) на #, за которым следует извлеченная строка $x.

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