2014-02-12 2 views
2

У меня есть файл, который имеет: отделенные данные, какБаша заменить слово в: отделенный файл

 
cat:dog:lion 
cat:mouse:tiger 

и я пытаюсь заменить собаку пыльников значения, как лиса, например, с помощью Баша. мне нужны изменения, чтобы иметь место внутри файла без изменения других данных

ответ

4

три возможных способа сделать это:

  1. awk -F: -v OFS=: '{for (i=1; i<=NF; i++) if ($i=="dog") $i="fox"} 1'
  2. perl -F: -lane 'print join ":" , map {$_ eq "dog" ? "fox" : $_} @F'
  3. sed -r 's/^|$/:/g; s/:dog:/:fox:/g; s/^:|:$//g;'

С СЕПГ и Perl, используют -i редактировать файл на месте.
С awk: awk ... > tmpfile && mv tmpfile orig_file

+0

Не могли бы вы рассказать мне, что означает 1 в awk expr – MohamedAli

+0

. Пожалуйста, прочтите http://stackoverflow.com/questions/18110351/shell-select-unique-row-of-flat-file/18111469#18111469 –

+0

спасибо, что ваша помощь – MohamedAli

2

Вы можете использовать патч в инлайн:

sed -i.bak -r 's/(^|:)dog(:|$)/\1fox\2/g' file 

ИЛИ на OSX:

sed -i.bak -E 's/(^|:)dog(:|$)/\1fox\2/g' file 

Becuase из -i изменений флаг сохраняться в самом файле.

+0

Это не изменит собаку, если это первое или последнее поле. –

+0

Я собирался набрать awk-ответ, но потом заметил «Мне нужно, чтобы изменения произошли внутри файла», чтобы выложить команду sed. Я подкорректирую команду sed. – anubhava

Смежные вопросы