Убрать текст из некоторых разделенных полей в списке

Интересно, какой самый быстрый способ был бы вырезать текст только из некоторых разделенных полей в списке.

Мой список выглядит так:
text text:number:text:text:text:text:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*

И я хочу, чтобы это выглядело так:
text text:*:*:*:*:text:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*

Поэтому некоторые поля, содержащие данные, должны быть заменены звездочками, некоторые поля должны быть не тронуты, а разделитель не согласован (первое и второе поля разделены пробелами). Это на файловой системе Linux, и способ сделать это встроенным в файл является предпочтительным.

Большое спасибо за помощь!

2 ответа

Я бы использовал регулярное выражение, соответствующее вашему тексту (скобки записывают текст в буфер, обозначенный \1, \2 и т. Д.):

(.*):([0-9]+):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)

и заменяющее регулярное выражение:

\1:\2:\*:\*:\*:\6:\*:\*:\*:\*:\*:\*

с помощью sed:

sed 's/matching-regularexpression/replacement-regular-expression/' name-of-text-file

Возможно, вам придется немного поиграть с escape-символами в зависимости от вашей оболочки.

Я бы, наверное, сделал это в Perl:

perl -pi.bak -e 's / ^ (\ w + \ s \ w +): \ d +: \ w +: \ w +: \ w +: (. *) / $ 1: $ 2 /' FILENAME

Другие вопросы по тегам